У меня есть script, который запускает мой PHP скрипт каждый X раз:
#!/bin/bash
while true; do
/usr/bin/php -f ./my-script.php
echo "Waiting..."
sleep 3
done
Как я могу запустить его как демон?
У меня есть script, который запускает мой PHP скрипт каждый X раз:
#!/bin/bash
while true; do
/usr/bin/php -f ./my-script.php
echo "Waiting..."
sleep 3
done
Как я могу запустить его как демон?
Чтобы запустить его как полный демон из оболочки, вам нужно будет использовать setsid
и перенаправить его вывод. Вы можете перенаправить вывод в файл журнала или на /dev/null
, чтобы отменить его. Предполагая, что ваш script называется myscript.sh, используйте следующую команду:
setsid myscript.sh >/dev/null 2>&1 < /dev/null &
Это полностью отключит процесс от текущей оболочки (stdin, stdout и stderr). Если вы хотите сохранить вывод в файле журнала, замените первый /dev/null
на ваш /path/to/logfile.
Вы должны перенаправить вывод, иначе он не будет запущен как истинный демон (он будет зависеть от вашей оболочки для чтения и записи вывода).
Daemon - это просто программа, которая работает как фоновый процесс, а не находится под прямым контролем интерактивного пользователя...
[Ниже приведен код bash для систем Debian - дистрибутивы Ubuntu, Linux Mint и т.д.)
Простой способ:
Простым способом было бы отредактировать файл /etc/rc.local, а затем просто запустить script (т.е. каждый раз при загрузке системы):
sudo nano /etc/rc.local
Добавьте следующее и сохраните:
#For a BASH script
/bin/sh TheNameOfYourScript.sh > /dev/null &
Лучший способ сделать это - создать Daemon через 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
Теперь, когда вы загружаете свою систему, вы можете увидеть файл журнала, в котором указано, что ваш Daemon запущен:
cat /var/log/TheNameOfYourDaemonJobLog.log
& бык; Теперь вы можете запустить/остановить/перезапустить/получить статус своего демона с помощью:
перезагрузка: это остановится, а затем запустите службу
sudo service TheNameOfYourDaemonrestart restart
start: это запустит службу, если она не запущена
sudo service TheNameOfYourDaemonstart start
stop: это остановит службу, если она работает
sudo service TheNameOfYourDaemonstop stop
статус: это покажет статус службы
sudo service TheNameOfYourDaemonstatus status
Вы можете перейти к /etc/init.d/- вы увидите шаблон демона, называемый скелетом.
Вы можете его дублировать, а затем ввести script в функции запуска.
Еще один интересный трюк - запустить функции или подоболочки в фоновом режиме, не всегда выполнимые, хотя
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 в вопрос, а только в теги, я хотел бы опубликовать здесь темы, которые необходимо понять, чтобы иметь возможность контролировать его/ее работу независимо от распределения:
Для вашей проблемы можно запустить скрипт в sysinit, добавив эту строку в /etc/inittab и сделав его респавн в случае его завершения:
# start and respawn after termination
ttyS0::respawn:/bin/sh /path/to/my_script.sh
Конечно, скрипт должен быть выполнен исполняемым заранее:
chmod +x /path/to/my_script.sh
Надеюсь это поможет