Я создал скрипт (который я уже тестировал, если он работает), и я хочу использовать crontab, чтобы запускать его каждый раз, когда мой компьютер перезагружается.

Я создал этот скрипт под названием test.sh просто для удовольствия, и это довольно просто:

#!/bin/bash
while true; do
echo "HELLO WORLD!"
done

Он просто печатает "Hello World", пока кто-нибудь не использует ctrl+c, он находится в каталоге /home /myuser /Scripts.

Поэтому я открываю crontab -e и добавляю

@reboot /home/myuser/Scripts/test.sh

Я перезагружаю машину, но ничего не происходит, в то время как если я вручную запускаю сценарий с помощью unsing ./test.sh, он просто работает.

Я не знаю, что не так ...

Не могли бы вы мне помочь?

2 ответа2

2

Откуда ты знаешь, что "ничего не происходит"? То, что скрипт не появляется в окне на вашем экране, не означает, что он не запущен.


Cron предназначен для "пакетных" задач, а не для запуска интерактивных программ, поэтому он не только не будет автоматически запускать окно терминала для вас (хотя это может быть сделано вручную), в большинстве случаев он не может запускать графическое приложение. поскольку он не знает, какую сессию X он должен использовать.

(Фактически, cron обычно запускает задачи @reboot задолго до того, как Xorg еще инициализировал графику ...)

Это означает, что вывод заданий cron идет в другом месте - сейчас он, вероятно, наводняет системный журнал (journalctl, или /var /log /syslog, или что-то в этом роде) бесконечным количеством «Hello World».

В качестве альтернативы, cron может отправить выходные данные задания по электронной почте, если система настроила это (обычно на серверах). Тем не менее, это происходит только тогда, когда работа заканчивается (и ваш пример сценария никогда не заканчивается).


Если вы хотите запустить что-то, что появилось бы на экране, есть механизмы для этого при входе в систему (не при загрузке):

  • Скорее всего, вы можете поместить ~/Scripts/test.sh & в файл ~/.xprofile . Это часто работает, но зависит от того, какой менеджер дисплеев использует система.

  • Другой метод - создать ~/.config/autostart/my-test-script.desktop:

    [Desktop Entry]
    Name=my test script
    Type=Application
    Exec=/home/myuser/Scripts/test.sh
    Terminal=yes
    
2

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .