У меня есть сценарий, который работает мой PHP скрипт каждый X раз:Выполнить скрипт Баш как демон
#!/bin/bash
while true; do
/usr/bin/php -f ./my-script.php
echo "Waiting..."
sleep 3
done
Как я могу начать его как демон?
У меня есть сценарий, который работает мой PHP скрипт каждый X раз:Выполнить скрипт Баш как демон
#!/bin/bash
while true; do
/usr/bin/php -f ./my-script.php
echo "Waiting..."
sleep 3
done
Как я могу начать его как демон?
Чтобы запустить его как полный демон из оболочки, вам нужно будет использовать setsid
и перенаправить его вывод. Вы можете перенаправить вывод в файл журнала или на /dev/null
, чтобы отменить его. Предположим, что ваш скрипт называется myscript.sh, используйте следующую команду:
setsid myscript.sh >/dev/null 2>&1 < /dev/null &
Это будет полностью отделить процесс от текущей оболочки (STDIN, стандартный вывод и стандартный поток ошибок). Если вы хотите сохранить вывод в файле журнала, замените первый /dev/null
на ваш/path/to/logfile.
Вы должны перенаправить вывод, иначе он не будет работать как истинный демон (это будет зависеть от вашей оболочки для чтения и записи вывода).
Вы можете перейти на /etc/init.d/ - вы увидите шаблон демона, называемый скелетом.
Вы можете его дублировать, а затем ввести свой скрипт под функцию запуска.
Вы также можете рассмотреть возможность запуска скрипта в backg раунд, добавив '&' в конце или запустив его без nohup. –
@ LuisMuñoz, как я могу заставить его работать в фоновом режиме автоматически. например, когда вы запускаете запуск /etc/init.d/mysql, демон запускается и запускается в фоновом режиме по умолчанию. –
@DavidOkwii помещает ваш код в функцию и запускает его в фоновом режиме. Проверьте мой ответ, добавленный к этому вопросу. –
демон просто программа, которая запускается как фоновый процесс, а не под непосредственным контролем интерактивного пользователя ...
[Код ниже Баш для систем Debian - Ubuntu, Linux Mint дистрибутивы и так далее]
простой способ:
простой способ будет отредактировать файл /etc/rc.local, а затем только что ваш скрипт запустить оттуда (т.е. каждый раз при загрузке системы) :
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
Теперь при загрузке системы, вы можете увидеть файл журнала о том, что ваш демон запущен:
cat /var/log/TheNameOfYourDaemonJobLog.log
• Теперь вы можете запустить/остановить/перезагрузка/получить статус вашего Daemon с помощью :
рестарта: это остановит, а затем запустить службу
sudo service TheNameOfYourDaemonrestart restart
старта: это запустит службу, если он не работает
sudo service TheNameOfYourDaemonstart start
остановки: это прекратить обслуживание, если оно работает
sudo service TheNameOfYourDaemonstop stop
статус: это будет отображать состояние службы
sudo service TheNameOfYourDaemonstatus status
Вы должны действительно указать, для какого дистрибутива это необходимо, потому что эти команды и пути не являются правильно на всех дистрибутивах. – SgtPooki
Хорошая точка sgtPooki. Я добавил оговорку, поясняющую, что мой пример относится к дистрибутивам Ubuntu/Mint и т. Д.Спасибо за комментарий. – CMP
Может ли кто-нибудь сделать надстройку systemd для этого ответа? :) – Mitja
Еще один крутой трюк, чтобы запустить функции или подоболочки в фоновом режиме, не всегда представляется возможным, хотя
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") &
как мне его убить? –
Вам нужно будет найти pid и отправить сигнал. Ниже приведен пример UNSAFE для Linux-систем: 'kill $ (ps -fade | grep myscript.sh | grep -v grep | awk '{print $ 2}')'. Это убьет все процессы, которые содержат «myscript.sh» в их имени или параметрах, поэтому его не очень безопасно использовать, но вы можете настроить его в соответствии с вашими потребностями. – micromoses
Спасибо, это полезно! Не могли бы вы объяснить, что делает '2> & 1 dev/null'? –