Запустите скрипт bash как демон

У меня есть скрипт, который запускает мой PHP-скрипт каждый раз X:

#!/bin/bash
while true; do
/usr/bin/php -f ./my-script.php
echo "Waiting..."
sleep 3
done

Как я могу запустить его как демон?

4 ответа

Решение

Чтобы запустить его как полноценный демон из оболочки, вам нужно использовать setsid и перенаправить его вывод. Вы можете перенаправить вывод в файл журнала или /dev/null отказаться от него. Предполагая, что ваш скрипт называется myscript.sh, используйте следующую команду:

setsid myscript.sh >/dev/null 2>&1 < /dev/null &

Это полностью отсоединит процесс от вашей текущей оболочки (stdin, stdout и stderr). Если вы хотите сохранить вывод в лог-файле, замените первый /dev/null с вашим /path/to/logfile.

Вы должны перенаправить вывод, иначе он не будет работать как настоящий демон (это будет зависеть от вашей оболочки для чтения и записи вывода).

Демон - это просто программа, которая работает как фоновый процесс, а не находится под непосредственным контролем интерактивного пользователя...

[Ниже приведен код bash для систем Debian - дистрибутивов Ubuntu, Linux Mint и т. Д.]

Простой способ:

Простым способом было бы отредактировать ваш файл /etc/rc.local, а затем просто запустить ваш скрипт оттуда (т.е. каждый раз, когда вы загружаете систему):

sudo nano /etc/rc.local

Добавьте следующее и сохраните:

#For a BASH script
/bin/sh TheNameOfYourScript.sh > /dev/null &

Лучший способ сделать это - создать демона с помощью Upstart:

sudo nano /etc/init/TheNameOfYourDaemon.conf

добавить следующее:

description "My Daemon Job"
author "Your Name"
start on runlevel [2345]    

pre-start script
  echo "[`date`] My Daemon Starting" >> /var/log/TheNameOfYourDaemonJobLog.log
end script

exec /bin/sh TheNameOfYourScript.sh > /dev/null &

Сохранить это.

Подтвердите, что это выглядит хорошо:

init-checkconf /etc/init/TheNameOfYourDaemon.conf

Теперь перезагрузите машину:

sudo reboot

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

cat  /var/log/TheNameOfYourDaemonJobLog.log

• Теперь вы можете запускать / останавливать / перезапускать / получать статус вашего демона через:

перезагрузка: это остановит, затем запустите службу

sudo service TheNameOfYourDaemonrestart restart

start: запускает службу, если она не запущена

sudo service TheNameOfYourDaemonstart start

остановить: это остановит службу, если она работает

sudo service TheNameOfYourDaemonstop stop

статус: будет отображаться статус сервиса

sudo service TheNameOfYourDaemonstatus status

Вы можете перейти в /etc/init.d/ - вы увидите шаблон демона с именем skeleton.

Вы можете продублировать его, а затем ввести свой скрипт под функцией запуска.

Еще один крутой прием - запускать функции или подоболочки в фоновом режиме, хотя это не всегда возможно

name(){
  echo "Do something"
  sleep 1
}

# put a function in the background
name &
#Example taken from here
#https://bash.cyberciti.biz/guide/Putting_functions_in_background

Запуск подоболочки в фоновом режиме

(echo "started"; sleep 15; echo "stopped") &

Некоторые комментаторы уже заявили, что ответы на ваш вопрос не будут работать для всех дистрибутивов. Поскольку вы не включили CentOS в вопрос, а только в теги, я хотел бы опубликовать здесь темы, которые необходимо понять, чтобы иметь возможность контролировать его / ее работу независимо от распределения:

  1. что такое демон init (необязательно)
  2. что такое файл inittab (/etc/inittab)
  3. что делает файл inittab в вашем дистрибутиве (например, запускает ли он все скрипты в /etc/init.d?)

Для вашей проблемы можно запустить скрипт в sysinit, добавив эту строку в / etc / inittab и сделав его респавн в случае его завершения:

# start and respawn after termination
ttyS0::respawn:/bin/sh /path/to/my_script.sh

Сценарий должен быть заранее выполнен исполняемым:

chmod +x /path/to/my_script.sh

Надеюсь это поможет

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