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