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

Ser*_* B. 54 linux centos daemons centos6

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

#!/bin/bash
while true; do
/usr/bin/php -f ./my-script.php
echo "Waiting..."
sleep 3
done
Run Code Online (Sandbox Code Playgroud)

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

mic*_*ses 124

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

setsid myscript.sh >/dev/null 2>&1 < /dev/null &
Run Code Online (Sandbox Code Playgroud)

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

您必须重定向输出,否则它将不会作为真正的守护程序运行(它将取决于您的shell来读写输出).

  • @DanielPatrick在bash(以及大多数其他shell)中这是stdin/stderr/stdout重定向.`//dev/null`(与`1>/dev/null`相同)将stdout(文件描述符1)重定向到/ dev/null."2>&1"表示将所有stderr(文件描述符2)重定向到文件描述符1,文件描述符1已重定向到/ dev/null.`//dev/null`将/ dev/null附加到stdin(fd 0).所有这些都让脚本从所有当前输入/输出源分离,并重新连接到/ dev/null.希望这个答案. (12认同)
  • 那怎么杀了呢? (8认同)
  • 你必须找到它的pid并发送信号.这是Linux系统的一个UNSAFE示例:`kill $(ps -fade | grep myscript.sh | grep -v grep | awk'{print $ 2}')`.这会杀死其名称或参数中包含"myscript.sh"的所有进程,因此使用起来不太安全,但您可以调整它以满足您的需求. (7认同)
  • 谢谢,这很有帮助!你能解释一下`2>&1 </ dev/null`在做什么吗? (3认同)

CMP*_*CMP 35

守护进程只是作为后台进程运行的程序,而不是由交互式用户直接控制...

[以下bash代码适用于Debian系统 - Ubuntu,Linux Mint发行版等等]

简单的方法:

简单的方法是编辑/etc/rc.local文件,然后从那里运行脚本(即每次启动系统时):

sudo nano /etc/rc.local
Run Code Online (Sandbox Code Playgroud)

添加以下内容并保存:

#For a BASH script
/bin/sh TheNameOfYourScript.sh > /dev/null &
Run Code Online (Sandbox Code Playgroud)

更好的方法是通过Upstart创建一个守护进程:

sudo nano /etc/init/TheNameOfYourDaemon.conf
Run Code Online (Sandbox Code Playgroud)

添加以下内容:

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 &
Run Code Online (Sandbox Code Playgroud)

保存这个.

确认它看起来没问题:

init-checkconf /etc/init/TheNameOfYourDaemon.conf
Run Code Online (Sandbox Code Playgroud)

现在重启机器:

sudo reboot
Run Code Online (Sandbox Code Playgroud)

现在,当您启动系统时,您可以看到日志文件指出您的守护程序正在运行:

cat  /var/log/TheNameOfYourDaemonJobLog.log
Run Code Online (Sandbox Code Playgroud)

•现在您可以通过以下方式启动/停止/重新启动/获取守护程序的状态:

重启:这将停止,然后启动服务

sudo service TheNameOfYourDaemonrestart restart
Run Code Online (Sandbox Code Playgroud)

start:这将启动一个服务,如果它没有运行

sudo service TheNameOfYourDaemonstart start
Run Code Online (Sandbox Code Playgroud)

停止:如果服务正在运行,这将停止服务

sudo service TheNameOfYourDaemonstop stop
Run Code Online (Sandbox Code Playgroud)

status:这将显示服务的状态

sudo service TheNameOfYourDaemonstatus status
Run Code Online (Sandbox Code Playgroud)

  • 你应该真正指出这是发行版,因为这些命令和路径在所有发行版上都不正确. (4认同)

小智 14

你可以去/etc/init.d/ - 你会看到一个名为skeleton的守护进程模板.

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

  • 你也可以考虑在后台运行脚本,最后添加'&'或者用nohup运行它. (2认同)