脚本作为daemon运行
在一些测试情况下,需要验证进程的继承关系,所以想能够持续运行一个脚本,作为daemon。
使用setsid
运行脚本作为daemon
setsid
运行脚本作为daemon要使得一个shell按照daemon方式运行,需要使用setsid
(setsid - run a program in a new session
)并将输出重定向。可以将输出重定向到一个认知文件,或者/dev/null
抛弃日志。
假设这里我们有一个 test_daemon.sh
脚本内容如下
则我们可以如下方式执行
但是发现这个test_daemon.sh
并没有如料想的一样运行,而是检查进程发现结束了
将/dev/null
替换成本地的一个日志文件/home/admin/test_daemon.log
,看输出情况
可以看到 test_daemon.log
中有一行记录
这个问题似乎和终端有关,是执行脚本命令需要tty么?
使用daemon
工具
daemon
工具参考 Using Daemon to create Linux services in 5 minutes - 这篇文章解释非常透彻清晰
daemon是一个将其他进程转换成daemon运行的工具,安装方法可以参考README。可以直接从从官网下载源代码安装,或者使用rpm安装。
make test
是用来检测libslack
,不确定用途
使用方法非常简单,假设这里运行一个test_daemon_10.sh
脚本
实验用的test_daemon_10.sh
内容如下
这个脚本唯一的功能就是不断循环并将输出记录到
/dev/shm/test_daemon
文件。
使用daemon -r
参数,这个-r
参数表示respawn
,也就是自动重新重启。表示当脚本被杀死以后,daemon
会自动再启动这个脚本作为服务。
下面我们来检验一下,先检查脚本进程
可以看到
我们杀死进程45749
然后再使用命令ps aux | grep test_daemon_10 | grep -v grep
检查系统中的test_daemon_10
,可以看到脚本进程已经杀死
过一会,我们再次使用命令 ps aux | grep test_daemon_10 | grep -v grep
就会发现脚本再次被daemon
进程启动(注意进程号不同了)
这个daemon化的脚本会一直运行,即使关闭终端窗口。
Using Daemon to create Linux services in 5 minutes还提供了SysVinit兼容的启动脚本用于
daemonize
脚本。
使用脚本functions来管理daemon(Red Hat/CentOS系使用)
Red Hat系发行版提供了一个标准化的/etc/init.d/functions
来管理daemon脚本。
参考
Beginners Guide to creating a daemon in Linux - 一个简单的c语言写的daemon,可参考
Last updated