У меня есть crontab, который работает так:
0 0 * * * /execute/shell/script.sh
0 0 * * * /execute/shell/script1.sh
0 0 * * * /execute/shell/script2.sh
И я хочу запускать каждый сценарий на другом экране. Но я хочу, чтобы этот экран оставался включенным, чтобы в любое время, когда я захочу увидеть прогресс одного из этих скриптов, я всегда мог просто сделать screen -d -r <PID>
и он снова прикрепит экран, чтобы я мог видеть прогресс.
Я уверен, что должен быть способ сделать это. но аналогичные вопросы, которые я нашел, не дали ответа.
Crontab запустить экран Как использовать crontab для запуска сеанса экрана?
Вы можете попробовать что-то вроде этого:
cat /etc/cron.d/test
*/10 * * * * root screen -dmS script bash -c '/execute/shell/script.sh; exec bash'
*/10 * * * * root screen -dmS script1 bash -c '/execute/shell/script1.sh; exec bash'
*/10 * * * * root screen -dmS script2 bash -c '/execute/shell/script2.sh; exec bash'
Я считаю, что это должно сработать. Конечно, отредактируйте время так, как вам нужно.
Вам действительно нужно взаимодействовать с командами, или вы просто хотите видеть статус до того, как команды будут завершены, а результаты будут отправлены вам по почте?
Я столкнулся с подобной "проблемой", когда я запускал traceroute(8)
и mtr
из cron, чтобы контролировать подключение, с mtr
работает в for
-loop для обеспечения более точных измерений в течение заданного интервала (от 5 до 16,67 минут (от 300 до 1000 циклов)), но весь скрипт рассчитан на работу около часа (чтобы гарантировать, что я не получу спама по электронной почте), поэтому , Я хотел видеть статус, как это произошло.
Способ cron
работает, он создает временный файл в / tmp и сразу вызывает unlink(2)
(но все еще сохраняя файл открытым); впоследствии это используется для сохранения вывода ваших скриптов до их завершения и отправляется вам по электронной почте.
Таким образом, вы можете использовать lsof -n -c cron
(и / или lsof -n | fgrep cron
), чтобы узнать количество открытых файлов, которые были удалены, а затем получить доступ к этим файлам через /proc/$PID/fd/$FD
пространство имен, чтобы увидеть вывод ваших скриптов, запущенных из cron, без необходимости screen
.
Вышеупомянутый (ответ Ярослава Кучера) не будет работать должным образом, потому что при втором вызове команды будут создавать новые сеансы экрана с теми же именами, что и предыдущие.
Если вы хотите, чтобы для одних и тех же сценариев всегда были одни и те же сеансы экрана, я бы сделал это немного сложнее.
Я бы запустил эти сеансы в @reboot cron со сценариями, которые создают постоянный цикл, например
#!/bin/bash
while true; do
if [ -f /tmp/script1_enabled ]; then
script1_function_or_command
rm /tmp/script1_enabled
fi
sleep 60;
done
Что будет запускать каждую минуту проверки наличия именованного файла в / tmp - если он существует, запустите команду, в противном случае подождите еще минуту.
Вторая часть - это команды cron, которые создают эти файлы каждый день и работают как логический флаг для запуска вызова скрипта.
После того, как сценарий будет готов, файл будет удален. Таким образом, вы можете сохранить одни и те же сеансы для своих скриптов и по-прежнему запускать их с интервалом, который вам нравится.
Если 60-секундная задержка в цикле слишком велика для вас (с помощью этого метода невозможно точно запустить скрипт в заданное время, так как сон будет выполняться в непредсказуемое время), вы можете настроить inotifywait наблюдает и выполняет сценарии сразу после создания файла.
cron будет выглядеть так:
@reboot screen -dmS script1 /usr/local/bin/script1_watcher
@reboot screen -dmS script2 /usr/local/bin/script2_watcher
0 0 * * * touch /tmp/script1_enabled
15 */4 * * * touch /tmp/script2_enabled