用daemon命令负责任务的自动重启

不知道大家主意过daemon这个命令行工具没有。这是一个Linux下的工具,也有BSD版本和MacOSX port。它可以启动和管理一个进程,包括这个进程的自动重启。

很多大规模机器学习系统(和其他大规模分布式计算系统)都需要有自动重启的功能。很多大公司有自己的分布式操作系统可以负责自动重启失败的任务(tasks)。可以如果没有这样的分布式操作系统怎么办?daemon命令可以是一个“穷人“的的解法。

启动一个任务

wangyi@localhost:~$ps daemon --name=data_server_1 --respawn -- sleep 999

启动一个任务,名字是data_server_1(对应/tmp/data_server_1.pid这个文件;这个文件用来保证不能再运行同一个daemon命令来启动同一个任务),这个任务执行命令 sleep 999。其中–respawn参数的意思是:如果 — 之后的命令(任务)挂了,daemon应该自动重启之。

此时,启动了一个daemon进程,它会fork(spawn)出来一个进程来执行命令sleep 999:

wangyi@localhost:~$ps auxwww | grep sleep
wangyi 15129 0.0 0.0 2432748 472 ?? S 10:47AM 0:00.00 sleep 999
wangyi 15128 0.0 0.0 2432896 312 ?? Ss 10:47AM 0:00.00 daemon --name=data_server_1 --respawn -- sleep 999

另外,/tmp/data_server_1.pid里存放的是daemon命令得到的process id:

wangyi@localhost:~$cat /tmp/data_server_1.pid
15128

任务的自动重启:

如果我们杀死一个由daemon fork的进程:

wangyi@localhost: kill 15129

Fork这个进程的daemon 进程会自动重启这个任务:

wangyi@localhost:~$ps auxwww | grep sleep
wangyi 15147 0.0 0.0 2432748 472 ?? S 10:47AM 0:00.00 sleep 999
wangyi 15128 0.0 0.0 2432896 312 ?? Ss 10:47AM 0:00.00 daemon --name=data_server_1 --respawn -- sleep 999

可以看到,任务15129虽然被杀死了,但是一个新的任务 15147 被启动来执行sleep 999

再启动一个任务

可以启动另一个任务,只要名字和之前的不同,执行的命令可以是同一个:

wangyi@localhost:~$daemon --name=data_server_2 --respawn -- sleep 999

wangyi@localhost:~$ps auxwww | grep sleep
wangyi 15201 0.0 0.0 2432748 472 ?? S 10:52AM 0:00.00 sleep 999
wangyi 15200 0.0 0.0 2432896 312 ?? Ss 10:52AM 0:00.00 daemon --name=data_server_2 --respawn -- sleep 999
wangyi 15129 0.0 0.0 2432748 472 ?? S 10:47AM 0:00.00 sleep 999
wangyi 15128 0.0 0.0 2432896 312 ?? Ss 10:47AM 0:00.00 daemon --name=data_server_1 --respawn -- sleep 999

这样我们就会有两个pid文件:

wangyi@localhost:~$ls /tmp/data_server*
/tmp/data_server_1.pid /tmp/data_server_2.pid

wangyi@localhost:~$cat /tmp/data_server*
15128
15200

停止任务:

用命令行参数–stop和–name来杀死任务:

wangyi@localhost:~$daemon --stop --name=data_server_1
wangyi@localhost:~$daemon --stop --name=data_server_2
wangyi@localhost:~$ps auxwww | grep sleep