Консоль Asterisk не работает должным образом, если запускается с @reboot cronjob [дубликат]

Контекст Для простого мониторинга я распечатываю текущих звонков внутри Asterisk в файл. Внутри сценария оболочки bash я использую бесконечный цикл для постоянной печати текущих абонентов из консоли Asterisk. Если я запускаю скрипт вручную, все работает должным образом (а также работает в фоновом режиме, он работает нормально до перезагрузки).

Вопрос: Если я запускаю скрипт как cronjob с '@reboot', то он выводит не текущих абонентов, а пустую строку. Я не уверен, проблема ли это в Asterisk (я так не думаю) или скрипт запускает неправильный вопрос. Кто-нибудь это знает?

Cronjob:

@reboot /home/xyz/bin/printCallers.sh

/home/xyz/bin/printCallers.sh:

#!/bin/bash
while true
do
   #!/bin/bash
   echo $(asterisk -rx 'core show channels verbose') >> /home/xyz/myfile.log # just to simplify, indeed: I use grep/awk to get right information and format it
   sleep 1m
done

Я не пробовал запускать скрипт как системную службу в моем Ubuntu, но мне очень хотелось бы знать, в чем проблема.

# cron asterisk
Источник
  • 0
    Зарегистрируйте ошибки, и он, вероятно, сообщит вам
  • 0
    Замените /home/xyz/bin/printCallers.sh на bash -x /home/xyz/bin/printCallers.sh >/tmp/log.txt 2>&1
  • 0
    echo $(stuff ...) очень часто бесполезное использование echo .
  • 0
    Возможно, звездочка уже остановилась перед этой работой.
  • 0
    echo $ (прочее ...) не проблема. На самом деле я использую его для хранения вывода внутри переменной. Чтобы упростить этот сценарий. Это тоже не работает: @reboot asterisk -rx 'core show channels verbose'> file Как ни странно, ошибки нет. Вот почему я спрашиваю здесь о stackoverflow :-).
Codelisting
за 1 против
Лучший ответ

Прежде всего, вы не должны ничего выполнять с помощью cron, не убедившись, что вы можете получить все, что выводится на stdout и stderr, чтобы знать, почему это не работает при возникновении ошибок.

Для этого есть два пути:

  • Прочтите письма, отправленные cron. Каждый раз, когда задание cron выводит что-то в stdout / stderr, оно отправляется вам (здесь пользователь root) по почте.

  • Или вместо этого перенаправьте stdout / stderr в файл журнала (и, возможно, поверните его с помощью logrotate):

      @reboot /home/xyz/bin/printCallers.sh >> /path/to/my.log 2>&1
    

А теперь вернемся к вашему вопросу. Цитата из справочной страницы crontab (5):

Several environment variables are set up automatically by the cron(8) daemon. SHELL is set to /bin/sh, and LOGNAME and HOME are set from the /etc/passwd line of the crontab's owner. PATH is set to "/usr/bin:/bin". HOME,SHELL, and PATH may be overridden by settings in the crontab.

asterisk вероятно лежит в/usr/sbin которого нет в вашем PATH. Либо определите PATH соответственно в вашем файле cron, либо используйте/usr/sbin/asterisk вместо простоasterisk .

  • 0
    Если я попробую @reboot /home/xyz/bin/printCallers.sh >> /path/to/my.log 2> & 1, я не получу ошибки. Раньше я много чего пробовал, чтобы получить сообщение об ошибке, но безуспешно.
  • 0
    Под «без ошибок» вы имеете в виду «абсолютно ничего в вашем файле my.log и ничего в почте root?». Если это так, добавьте "echo foobar" вверху вашего скрипта printCallers.sh. Вы должны получить что-то либо в my.log, либо в почте root.
  • 0
    Настоящая проблема заключалась в PATH. Использование "/ usr / sbin / asterisk" вместо "звездочки" в моем скрипте решило эту проблему. Я ожидал получить сообщение об ошибке, что звездочка не найдена ... Странно, что я не получал никаких сообщений об ошибках. В любом случае она решена, и теперь я знаю, где именно была проблема. Спасибо, xhienne, за ваш вклад!
  • 0
    Вы получили ошибку, что звездочка не найдена. Как было сказано выше, ошибка была отправлена root по почте. Я думаю, вы просто не проверяли локальную почту root.
Codelisting
Популярные категории
На заметку программисту