作为守护进程运行 bash 脚本
- 2024-10-31 08:38:00
- admin 原创
- 54
问题描述:
我有一个脚本,每 X 次运行一次 PHP 脚本:
#!/bin/bash
while true; do
/usr/bin/php -f ./my-script.php
echo "Waiting..."
sleep 3
done
我如何将其作为守护进程启动?
解决方案 1:
要从 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 来读取和写入输出)。
解决方案 2:
守护进程只是作为后台进程运行的程序,而不是受交互式用户的直接控制......
[以下 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
状态:这将显示服务的状态
sudo service TheNameOfYourDaemonstatus status
解决方案 3:
您可以转到 /etc/init.d/ - 您将看到一个名为skeleton 的守护进程模板。
您可以复制它然后在启动函数下输入您的脚本。
解决方案 4:
另一个很酷的技巧是在后台运行函数或子 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") &
解决方案 5:
一些评论者已经表示,您的问题的答案并不适用于所有发行版。由于您没有在问题中包含 CentOS,而只在标签中包含了 CentOS,因此我想在这里发布人们必须了解的主题,以便无论使用哪种发行版,都能控制自己的操作:
什么是 init 守护进程(可选)
什么是 inittab 文件 (/etc/inittab)
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
希望这有帮助
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件