Планирование задач переднего плана в Linux аналогично планировщику задач Windows

У меня есть пакетное приложение в Windows, которое я запускаю каждый день в полночь. Недавно я преобразовал его в сценарий оболочки Linux на машине Linux и хотел бы аналогичным образом запускать его каждый день в полночь. Мои требования следующие:-

  • Чтобы shell-скрипт выполнялся на переднем плане - это нужно для того, чтобы я мог видеть вывод запущенного процесса и исправлять/корректировать его в случае сбоя.
  • Подобно тому, как работает планировщик задач Windows, я хотел бы иметь список сценариев, которые я могу запускать, и эти списки могут быть включены/выключены.
  • (Дополнительно) В идеале, эквивалент планировщика задач может быть изменен программно. Это позволило бы мне отключать/включать задачи, основываясь на результатах уже запущенной задачи.

Можно ли это сделать? Я видел ссылки ниже, но они не содержат всех критериев, которые мне нужны для моего случая использования. Если одна из приведенных ниже ссылок - правильный путь, то пример может быть очень полезен.

3
задан 27 August 2021 в 10:19

3 ответа

Чтобы запустить задание cron в полночь , вы должны префикс своей команды или путь к вашему сценарию с помощью:

0 0 * * *

Например, для запуска / home / youssif / myscript , вы должны использовать:

0 0 * * /home/youssif/myscript

в вашем файле crontab.


Чтобы отредактировать файл crontab , используйте crontab -e , чтобы запустить команду от имени вашего текущего пользователя. В качестве альтернативы, если вам абсолютно необходимо запустить команду от имени пользователя root, вы можете запустить sudo crontab -e , чтобы отредактировать файл crontab.


Чтобы запустить команду в терминале (не рекомендуется, если вы запускаете команду от имени пользователя root), вам нужно будет указать отображение, которое будет использоваться в вашей команде или в вашем сценарии.Для этого, предполагая, что ваш $ DISPLAY равен : 0 (по умолчанию), вы можете префикс своей команды с помощью следующей переменной:

DISPLAY=:0

Кроме того, терминал обычно закрывается после того, как команда выполняется, но вы можете использовать опцию удержания с xterm , чтобы терминал оставался открытым.

Итак, чтобы запустить echo "hello world" в терминале в полночь, ваша команда будет выглядеть так:

0 0 * * DISPLAY=:0 xterm -hold -e 'echo "hello world"'

или для запуска вашего скрипта:

0 0 * * DISPLAY=:0 xterm -hold -e '/home/youssif/myscript'

Однако стандарт способ проверить вывод cronjob - перенаправить вывод терминала в файл, который вы можете просмотреть позже.

Например, чтобы перенаправить вывод терминала в файл /home/youssif/helloworld.log , вы должны использовать следующую строку в вашем файле crontab:

0 0 * * echo "hello world" > /home/youssif/helloworld.log

В качестве альтернативы вы также можете использовать tee , чтобы перенаправить вывод следующим образом:

0 0 * * echo "hello world" | tee /home/youssif/helloworld.log

Наконец, вы можете использовать команду cat для просмотра содержимого файла:

cat /home/youssif/helloworld.log

Таким образом, команда может выполняться в фон, но вы все равно можете проверить результат.


Чтобы отключить / включить задачи на основе результата уже запущенной задачи , я думаю, это действительно было бы более уместно для отдельного вопроса. Я считаю, что ваш ответ будет включать использование оператора if then else в сценарии bash.


РЕДАКТИРОВАТЬ:

Как указал @Tcooper , мы должны добавить 2> & 1 , чтобы перенаправить весь вывод, включая сообщения об ошибках , чтобы вы может вместо этого использовать что-то вроде этого:

0 0 * * echo "hello world" 2>&1 > /home/youssif/helloworld.log

или

0 0 * * echo "hello world" 2>&1 | tee /home/youssif/helloworld.log
8
ответ дан 4 September 2021 в 09:27

Все эти требования могут быть легко выполнены. Традиционным способом планирования заданий в Linux является crontab. «Современный» способ планирования заданий в Linux — systemd. crontab продолжает поддерживаться в Ubuntu.

Ваше Требование 1: необычно: вы ждете за компьютером в полночь, когда начнется задача? В противном случае именно поэтому файлы журналов используются в linux. Затем системный администратор может проверить журналы в дневное время, чтобы проверить, как все происходило.

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

crontab и/или systemd удовлетворяют требованию 2. Список заданий отображается в выходных данных systemd list-units или в файле crontab. Вы можете включить/отключить/удалить с помощью команд systemd или путем удаления/добавления комментария # перед задачей, или полностью удалить строку.

Требование 3 может быть легко написано. Последующая работа может прочитать, что сделала предыдущая работа, и действовать соответственно.

4
ответ дан 4 September 2021 в 09:27

Я должен подчеркнуть, что кое-что из того, что вы спрашиваете, довольно нетрадиционно, и не зря. Например, выполнение запланированной задачи на переднем плане означает, что вывод будет потерян, когда он превысит буфер обратной прокрутки (т.е. емкость для хранения «истории вывода») вашего терминала. Вот почему гораздо более привычно отправлять вывод в файл журнала, а не отображать его непосредственно в терминале, и я определенно рекомендую вам придерживаться этого соглашения.

При этом ... supercronic - это планировщик задач, который вы можете запускать как обычный (не root) пользователь на переднем плане, который имеет возможность записывать выходные данные непосредственно в терминал. Он читает файл, похожий на crontab, в котором вы можете указать список скриптов для запуска и время их запуска, и вы можете организовать некоторый автоматизированный процесс для редактирования файла и сигнализировать суперкронному процессу, чтобы он принимал изменения. . Кажется, он отвечает всем вашим требованиям.

0
ответ дан 4 September 2021 в 09:27

Другие вопросы по тегам:

Похожие вопросы: