第十二篇 自己编写守护进程
守护进程可以让你的Python代码一直运行,不论你的终端窗口是否关闭。
下面我们看看用systemd如何实现守护进程(我的环境Centos 7)。
为test.py文件创建守护进程,python安装位置为/usr/bin/python在目录下创建一个systemd的文件test.service写入以下内容
[Unit]
Description=test deamon
After=rc-local.service
[Service]
Type=simple
User=root
Group=root
WorkingDirectory=/home
ExecStart=/usr/bin/python test.py
Restart=always
[Install]
WantedBy=multi-user.target
操作命令:
启动: systemctl start test.service
停止: systemctl stop test.service
查看python进程
ps -ef | grep python
查看系统是否支持systemd则可以执行如下命令,如果提示未找到命令则说明系统不支持systemd
systemctl --version
注:现在大部分Linux衍生版本都支持systemd(如centos,deepin),部分不支持(如:Ubuntu14.04之前的版本)
查看系统详细信息
hostnamectl
附:service文件参数详情
1、Unit部分[Unit]
Description=zidingyi-shell
After=network.target是启动顺序与依赖关系
1)Description字段:给出当前服务的简单描述。
2)After字段:表示本服务应该在某服务之后启动。(After和Before字段只涉及启动顺序,不涉及依赖关系。设置依赖关系,需要使用Wants字段和Requires字段。)
3)Wants字段:表示本服务与某服务之间存在“依赖”系,如果被依赖的服务启动失败或停止运行,不影响本服务的继续运行。
4)Requires字段,表示本服务与某服务之间存在“强依赖”系,如果被依赖的服务启动失败或停止运行,本服务也必须退出。2、Service部分
[Service]
Type=simple
User=root
ExecStart=/bin/bash /root/test.sh
Restart=on-failure1)Type字段:定义启动类型
simple(默认值):ExecStart字段启动的进程为主进程。forking:ExecStart字段将以fork()方式启动,此时父进程将会退出,子进程将成为主进程。
oneshot:类似于simple,但只执行一次,Systemd会等它执行完,才启动其他服务。
dbus:类似于simple,但会等待D-Bus信号后启动。
notify:类似于simple,启动结束后会发出通知信号,然后Systemd再启动其他服务。
idle:类似于simple,但是要等到其他任务都执行完,才会启动该服务。
2)ExecStart字段:启动服务时执行的命令,可以是可执行程序、系统命令或shell脚本
3)Restart字段:服务程序退出后,Systemd的重启方式
no(默认值):退出后不会重启;on-failure:非正常退出时(退出状态码非0),包括被信号终止和超时,才会重启3、Install部分
[Install]
WantedBy=multi-user.target定义如何安装这个配置文件,即怎样做到开机启动
来自:链接
1)WantedBy字段:表示该服务所在的Target。
(Target的含义是服务组,表示一组服务。WantedBy=multi-user.target指的是,自定义脚本所在的Target是multi-user.target(多用户模式)。这个设置非常重要,因为执行systemctl enable zdy.service命令时,zdy.service会被链接到/etc/systemd/system/multi-user.target.wants目录之中,实现开机启动的功能。)
来自:链接