繁体   English   中英

将bash脚本作为守护程序运行

[英]Run bash script as daemon

我有一个脚本,该脚本每隔X次运行一次我的PHP脚本:

#!/bin/bash
while true; do
/usr/bin/php -f ./my-script.php
echo "Waiting..."
sleep 3
done

如何将其作为守护程序启动?

要将其作为完整的守护程序从shell运行,您需要使用setsid并重定向其输出。 您可以将输出重定向到日志文件,或重定向到/dev/null以将其丢弃。 假设您的脚本名为myscript.sh,请使用以下命令:

setsid myscript.sh >/dev/null 2>&1 < /dev/null &

这会将进程与当前的shell(stdin,stdout和stderr)完全分开。 如果要将输出保留在日志文件中,请用/ path / to / logfile替换第一个/dev/null

您必须重定向输出,否则它将不能作为真正的守护程序运行(它将取决于您的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创建一个守护进程:

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的守护程序模板。

您可以复制它,然后在启动功能下输入脚本。

另一个很酷的技巧是在后台运行函数或子shell,尽管并不总是可行的

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

一些评论者已经指出,您的问题的答案并不适用于所有发行版。 由于您没有在问题中包括CentOS,而仅在标签中,因此,我想在这里发布一个主题,您必须理解这些主题,以便控制他/她的程序,而与分发无关:

  1. 什么是init守护进程(可选)
  2. 什么是inittab文件(/ etc / inittab)
  3. inittab文件在您的发行版中有什么作用(例如,它实际上运行/etc/init.d中的所有脚本吗?)

对于您的问题,可以通过在/ etc / inittab中添加以下行来在sysinit上启动脚本,并在终止时重新生成该脚本:

# start and respawn after termination
ttyS0::respawn:/bin/sh /path/to/my_script.sh

当然,必须事先使脚本可执行:

chmod +x /path/to/my_script.sh

希望这可以帮助

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM