
У меня есть скрипт, в котором есть цикл "while true". И я хочу запускать этот скрипт из cron каждую минуту, так что когда процесс будет завершен (или произойдет сбой - неважно почему), cron снова запустит скрипт.
Но когда я проверяю ps -aef --forest
там мой процесс запущен /usr/sbin/CROND -n
. Это не было бы плохо для cron или системы? Или, может быть, мне следует сделать это по-другому?
решение1
systemd
Возможно, подойдет краткий пример услуги .
Это наш бесконечный скрипт, местоположение /path/to/infinite_script
, исполняемый набор битов:
#!/bin/bash
while ((1)) ; do
date >> /tmp/infinite_date
sleep 2
done
Нет, нам нужно определить файл службы:
[Unit]
#just what it does
Description= infinite date service
[Service]
#not run by root, but by me
User=fiximan
#we assume the full service as active one the script was started
Type=simple
#where to find the executable
ExecStart=/path/to/infinite_script
#what you want: make sure it always is running
Restart=always
[Install]
#which service wants this to run - default.target is just it is loaded by default
WantedBy=default.target
и поместите его в/etc/systemd/system/infinite_script.service
Теперь загрузите и запустите службу (как root):
systemctl enable infinite_script.service
systemctl start infinite_script.service
Служба сейчас запущена и мы можем проверить ее статус.
systemctl status infinite_script.service
● infinite_script.service - infinite date service
Loaded: loaded (/etc/systemd/system/infinite_script.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2019-05-28 14:18:52 CEST; 1min 33s ago
Main PID: 7349 (infinite_script)
Tasks: 2 (limit: 4915)
Memory: 1.5M
CGroup: /system.slice/infinite_script.service
├─7349 /bin/bash /path/to/infinite_script
└─7457 sleep 2
Mai 28 14:18:52 <host> systemd[1]: Started infinite date service.
Теперь, если вы завершите скрипт ( kill 7349
- main PID) и снова проверите статус:
● infinite_script.service - infinite date service
Loaded: loaded (/etc/systemd/system/infinite_script.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2019-05-28 14:22:21 CEST; 12s ago
Main PID: 7583 (infinite_script)
Tasks: 2 (limit: 4915)
Memory: 1.5M
CGroup: /system.slice/infinite_script.service
├─7583 /bin/bash /path/to/infinite_script
└─7606 sleep 2
Mai 28 14:22:21 <host> systemd[1]: Started infinite date service.
Обратите внимание, что он был мгновенно перезапущен с новым PID.
И проверьте владельца файла вывода:
ls /tmp/infinite/date
-rw-r--r-- 1 fiximan fiximan 300 Mai 28 14:31 infinite_date
Таким образом, скрипт запускается правильным пользователем, как указано в файле службы.
Конечно, вы можете остановить и отключить службу:
systemctl stop infinite_script.service
systemctl disable infinite_script.service
РЕДАКТИРОВАТЬ:
Еще несколько деталей: персональные службы пользователя могут (по умолчанию) размещаться в $HOME/.config/systemd/user/
и управляться соответствующим образом с помощью systemctl --user <commands>
. Не требуется root, как и в случае с персональным crontab.
решение2
му.
cron — неподходящий инструмент для этой работы.
Правильный инструмент — этоМенеджер по обслуживанию, более того, один из них включает в себя идею автоматического перезапуска служб после их завершения. (Не все делают это.) Такие менеджеры служб включают в себя:
- Дэн БернстайнDAEMON Tools
- Адам Сэмпсоносвобожденный
- Брюс Гюнтерdaemontools-encore
- Лорана Беркос6
- Геррит Пейпзапустить его
- Уэйн Маршаллпреступник
- launchd (только для MacOS)
- systemd (только Linux)
- fscd (только FreeBSD)
- супервайзер
- Мойперекус
Один создает определение службы, соответствующее менеджеру службы, которое запускает бесконечный циклический сценарий, и добавляет его. Для нескольких менеджеров службы это просто небольшая run
программа (обычно сама по себе скрипт), которая запускает бесконечный циклический сценарий. Менеджеры службы выполняют запуск, мониторинг и автоматический перезапуск.
Некоторые менеджеры служб легко используются для управления службами как на уровне пользователя, так и на уровне всей системы, и можно настроить это как определение службы на уровне пользователя, которая будет работать как ваша собственная учетная запись и которой можно управлять без привилегий суперпользователя (которые требуются для управления службами на уровне всей системы).
дальнейшее чтение
- Джошуа Тимберман (29 декабря 2012 г.).Надзор за процессом: решенная проблема.
- Ларри Дулитл (23 июня 2005 г.).Основы демона Unix.
- Джонатан де Бойн Поллард (2015).Семейство daemontools. Часто задаваемые ответы.
- Убедитесь, что процесс всегда запущен
- Как автоматически перезапустить процесс после его завершения в Linux/CentOS
решение3
@ФеликсДжН
Предостережение: включение selinux может помешать запуску вашего скрипта. Чтобы он заработал, я
переместил его в
/usr/local/bin
(папку, которую поддерживает selinux)и отредактировано
/etc/systemd/system/infinite_script.service
для исправленияExecStart
соответствующим образомпобежал
sudo restorecon -rv /usr/local/bin
, чтобы получить эту информацию в selinux ипобежал
systemctl daemon-reload
наконецперезапустить службу
systemctl start infinite_script.service