Запустить 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 distros и так далее]

самый простой способ:

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

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

• теперь вы можете start/stop/restart / получить статус демона через:

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

sudo service TheNameOfYourDaemonrestart restart

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

sudo service TheNameOfYourDaemonstart start

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

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") &