运行bash脚本作为守护进程
我有一个脚本,每次运行我的PHP脚本:
#!/bin/bash while true; do /usr/bin/php -f ./my-script.php echo "Waiting..." sleep 3 done
我怎样才能作为守护进程启动它?
要从shell运行完整的守护进程,你需要使用setsid
并redirect它的输出。 您可以将输出redirect到日志文件,或者将其redirect到/dev/null
以放弃它。 假设您的脚本被称为myscript.sh,请使用以下命令:
setsid myscript.sh >/dev/null 2>&1 < /dev/null &
这将完全脱离你的当前shell(stdin,stdout和stderr)的进程。 如果要将输出保留在日志文件中,请使用/ path / to / logfilereplace第一个/dev/null
。
你必须redirect输出,否则它不会作为一个真正的守护进程运行(这取决于你的shell读写输出)。
守护进程只是作为后台进程运行的程序,而不是由交互式用户直接控制的。
[下面的bash代码是针对Debian系统的 – Ubuntu,Linux Mint发行版等等]
简单的方法:
简单的方法是编辑你的/etc/rc.local文件,然后让你的脚本从那里运行(即每次启动系统):
sudo nano /etc/rc.local
添加以下内容并保存:
#For a BASH script /bin/sh TheNameOfYourScript.sh > /dev/null &
更好的方法是通过Upstart创build一个守护进程:
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
开始:这将启动一个服务,如果它没有运行
sudo service TheNameOfYourDaemonstart start
停止:这将停止服务,如果它正在运行
sudo service TheNameOfYourDaemonstop stop
状态:这将显示服务的状态
sudo service TheNameOfYourDaemonstatus status
你可以去/etc/init.d/ – 你会看到一个名为skeleton的守护进程模板。
您可以复制它,然后在启动函数下input您的脚本。
另一个很酷的技巧是在后台运行函数或子壳,但并不总是可行的
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
在后台运行子shell
(echo "started"; sleep 15; echo "stopped") &