init скрипты в стиле SysV являются исторически первым способом управления службами и автоматического их запуска после перезагрузки.
В современных системах используется в основном systemd, но обратная совместимость в большинстве случаев сохраняется.
init скрипты размещаются на сервере в каталоге /etc/init.d и запускаются оттуда.
root@server:~# ls /etc/init.d/ | head
apache-htcacheclean
apache2
apparmor
apport
atd
console-setup.sh
cron
cryptdisks
cryptdisks-early
dbus
В каталоге находятся скрипты добавленные системой и скрипты, создаваемые в процессе установки сервисов. Также там можно размещать свои скрипты.
init скрипты в стиле SysV — написание скрипта для своего сервиса
Рассмотрим написание скрипта для своей службы, которая будет управляться системой в автоматическом режиме — прежде всего запускаться после перезагрузки.
Администратор сможет отдавать команды start | stop | restart | status
Скрипт будет называться monitor и будет проверять запущен ли веб-сервер на порту 80
Создадим скрипт
touch /etc/init.d/monitor
Потребуется присвоить ему бит исполнения
chmod +x /etc/init.d/monitor
Теперь переходим к написанию самого init скрипта на bash
mcedit /etc/init.d/monitor
#!/bin/bash #chkconfig: 2345 20 80 #description: monitor apache web server #Source function library. case "$1" in start) echo "start `date`" >> /var/log/monitor.log /opt/monitor.sh & echo $!>/var/run/monitor.pid ;; stop) echo "stop + `date`" >> monitor.log kill $(cat /var/run/monitor.pid) rm /var/run/monitor.pid ;; restart) $0 stop $0 start ;; status) if [ -e /var/run/monitor.pid]; then echo monitor is running, pid=$(cat /var/run/monitor.pid) else echo monitor is NOT running exit 1 fi ;; *) echo "Usage: $0 {start|stop|restart|status}" esac exit 0
Сам скрипт в простейшем случае может выглядеть так
mcedit /opt/monitor.sh
res=`netstat -nltp | grep 80` && echo $res && if [[ $res != '' ]] ; then mail -s ALERT [email protected]
Он проверяет службу на порту 80 и при ее отсутствии отправляет сообщение администратору.
Также нужен бит исполнения
chmod +x /opt/monitor.sh
Стартуем написанный сервис
/etc/init.d/monitor start
Проверяем статус
/etc/init.d/monitor status
monitor is running, pid=5918
Затем останавливаем выполнение
/etc/init.d/monitor stop
Процесс был успешно завершен
/etc/init.d/monitor status
monitor is NOT running
Проверим записи в логе, чтобы убедиться в том, что скрипт работает так как нужно
tail -f /var/log/monitor.log
start Пт июн 15 16:40:41 +05 2018
stop + Пт июн 15 16:43:21 +05 2018
Читайте про exit code в Bash скриптах и про /etc/rc.local — файл, который можно использовать для запуска любого процесса после того как загрузилась операционная система
Проще настраивается запуск любых скриптов через systemd, пример можно посмотреть в материале про запуск приложения на nodejs production