71

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

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

我怎样才能将它作为守护进程启动?

4

5 回答 5

164

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

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

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

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

于 2013-10-07T21:37:29.310 回答
42

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

[以下 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

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

sudo service TheNameOfYourDaemonstart start

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

sudo service TheNameOfYourDaemonstop stop

status:这将显示服务的状态

sudo service TheNameOfYourDaemonstatus status
于 2015-08-04T21:39:51.400 回答
15

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

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

于 2013-10-07T20:30:44.713 回答
2

另一个很酷的技巧是在后台运行函数或子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") &
于 2016-04-01T18:56:11.910 回答
0

一些评论者已经表示,您的问题的答案不适用于所有发行版。由于您没有将 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

希望这可以帮助

于 2019-01-31T11:23:16.797 回答