Запустите скрипт 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 в вопрос, а только в теги, я хотел бы опубликовать здесь темы, которые необходимо понять, чтобы иметь возможность контролировать его / ее работу независимо от распределения:
- что такое демон init (необязательно)
- что такое файл inittab (/etc/inittab)
- что делает файл 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
Надеюсь это поможет