Cronjob вполне может быть запущен - однако вы не указали перенаправление его вывода (stdout), поэтому у него нет места для отображения. Задачи, запускаемые cron, отвечают за собственную регистрацию / вывод - cron не обеспечивает возможности перенаправления вывода.
Вы можете сделать так, чтобы задание cron запускало терминал, а затем запускало в нем ваш скрипт; Вот пример этого:
Сначала настройте crontab с помощью crontab -e (запускается от имени пользователя, с которым вы хотите запускать скрипт).
Добавить работу стандартным способом; Я запускаю эту программу каждую минуту для тестирования:
* * * * * /home/argonauts/scripts/test.sh
В вашем скрипте вам нужно явно настроить отображение и запустить терминал. Вот что я использовал для test.sh:
#!/bin/bash
DISPLAY=:0 xterm -hold -e bash -c "while true; do echo Hello World!; done" &
DISPLAY=:0 konsole --noclose -e bash -c "/home/argonauts/scripts/test2.sh" &
Первая команда запускает окно xterm, в котором выполняется цикл Hello World. Аргумент -hold
сохраняет окно открытым после выполнения команды (что, я полагаю, в данном конкретном случае имеет место, когда true == false ...).
Вторая команда запускает консольный терминал и выполняет в нем второй скрипт. Для проверки контекста я использовал этот крошечный тестовый скрипт test2.sh
. --noclose
является эквивалентом xterm's -hold
#!/bin/bash
echo "This is `basename $0`"
На земле 'cron' имейте в виду, что ваша обычная оболочка очень ограничена. Добавьте команду env
в скрипт, вызываемый cron, чтобы увидеть, к чему он имеет доступ. Обычно вам нужно использовать полные пути ко всему, включая вещи в /bin /. Он также может по умолчанию использовать sh
а не bash
, так что будьте явными при определении используемой оболочки. Обычно в большинстве дистрибутивов sh
является bash
, но вызывается в режиме совместимости, который может сломать многие вещи.
Если вы отлаживаете cronjob, посмотрите в /var /log /cron подробности о том, запущены ли они, и какие-либо ошибки. Вы также должны посмотреть на службу, используя systemctl status crond
чтобы убедиться, что она работает и не находится в состоянии сбоя . Наконец, journalctl и /var /log /messages содержат информацию о cronjobs по мере их выполнения.
И, очевидно, измените расписание * * * * *
в crontab на @reboot, как только закончите тестирование.
Существует также очень (редактировать - забыл прилагательное) аналогичная возможность в systemd с использованием таймеров. Этот синтаксис немного придирчив и по умолчанию запускается от имени пользователя root, но на случай, если вам интересно:https://coreos.com/os/docs/latest/scheduling-tasks-with-systemd-timers.html