Рейтинг:3

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

флаг cn

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

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

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

mchid avatar
флаг bo
Не могли бы вы объяснить, почему они не соответствуют вашим критериям? Пожалуйста, будьте конкретны. В противном случае мы просто будем догадываться о том, что вы уже рассмотрели, и, возможно, зря потратим время. Спасибо.
mchid avatar
флаг bo
Кстати, [чтобы запустить задание cron в полночь] (https://crontab.guru/every-night-at-midnight), вы должны добавить к своей команде или пути к вашему сценарию префикс `0 0 * * *` Например , чтобы запустить `/home/youssif/myscript`, вы должны использовать `0 0 * * /home/youssif/myscript` в вашем файле crontab. Чтобы отредактировать файл crontab, используйте `crontab -e` для запуска команды от имени вашего текущего пользователя. В качестве альтернативы, если вам абсолютно необходимо запустить команду от имени пользователя root, вы можете запустить `sudo crontab -e`, чтобы отредактировать файл crontab.
mchid avatar
флаг bo
Минута равна 0. Час равен 0. Каждый день месяца = * Каждый месяц = ​​* Каждый день недели = *
Zanna avatar
флаг kr
Это довольно широко для нашего сайта. Это может помочь, если вы объясните, что делает ваш скрипт, или поделитесь им в вопросе. В идеале я бы рекомендовал вам попробовать и определить проблемы, с которыми вы столкнулись, чтобы вы могли задать более конкретные вопросы.
Рейтинг:8
флаг bo

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

0 0 * * *

Например, для запуска /дом/юссиф/myscript , вы бы использовали:

0 0 * * /home/youssif/myscript

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


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


Чтобы запустить команду в терминале (не очень хорошая идея, если вы запускаете команду от имени пользователя root), вам нужно будет указать дисплей для использования в вашей команде или в вашем скрипте. Для этого, предполагая, что ваш $ ДИСПЛЕЙ является :0 (по умолчанию) вы можете добавить к своей команде следующую переменную:

ДИСПЛЕЙ=:0

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

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

0 0 * * DISPLAY=:0 xterm -hold -e 'эхо "привет, мир"'

или запустить ваш скрипт:

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

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

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

0 0 * * echo "привет, мир" > /home/youssif/helloworld.log

Кроме того, вы также можете использовать тройник команда для перенаправления вывода следующим образом:

0 0 * * эхо "привет, мир" | тройник /home/youssif/helloworld.log

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

кошка /home/youssif/helloworld.log

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


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


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

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

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

или же

0 0 * * эхо "привет, мир" 2>&1 | тройник /home/youssif/helloworld.log
mchid avatar
флаг bo
Тем не менее, я думаю, что запускать crontab в терминале от имени пользователя root, вероятно, ** не очень хорошая идея. Это может привести к тому, что ваш файл Xauthority потеряет правильные разрешения. ** Это может не быть проблемой с Wayland, но я не уверен. Это одна из многих причин, по которой лучше всего перенаправлять вывод в файл.
Youssif Saeed avatar
флаг cn
Спасибо за ваш подробный ответ. Я проверил это, и это работает для меня. Это именно то, что мне нужно было для начала.
TCooper avatar
флаг cn
Вероятно, стоит упомянуть, если вы хотите, чтобы весь вывод направлялся в ваш файл журнала и никуда больше, добавьте «2>&1», где 2 — стандартный вывод ошибок, а 1 — стандартный вывод. Поэтому отправьте ошибки на стандартный вывод и выведите все в свой файл журнала. Или, в качестве альтернативы, в два разных файла журнала: «2>err_log.txt 1>cron_log.txt» — не объявляя это значение по умолчанию для системной электронной почты для ошибок cron, что я нахожу ... раздражающим, по крайней мере, по сравнению с использованием файла журнала
флаг fr
A.L
`0 0 * * echo "hello world" > /home/youssif/helloworld.log` будет стирать журнал каждый день. С помощью `>>` содержимое будет добавляться в конец файла каждый день.
mchid avatar
флаг bo
@AL Да, я решил пойти с этим, потому что это было бы больше похоже на открытие терминала и предоставление вывода для одного сеанса. Я думаю, что было бы лучше добавить дату к префиксу журналов, и это просто усложнило бы и без того сложный ответ.
Рейтинг:4
флаг cn

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

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

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

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

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

Рейтинг:0
флаг es

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

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

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.