守护进程(Daemon)是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。
下面我们看看用systemd如何实现守护进程(我的环境Centos 7)
#!/usr/bin/env python # -*- coding=utf-8 -*- """ 每隔5秒输出本地时间到指定的文件 path: /home/test.py """ import time filepath = '/home/time' # 文件路径 fm = '%Y-%m-%d %X' def get_time(): while 1: nowtime = time.strftime(fm, time.localtime()) with open(filepath, 'a') as fp: fp.write(nowtime) fp.write('\n') time.sleep(5) if __name__ == '__main__': get_time()
接着我们在/home目录下创建一个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
把此文件复制到systemd目录下:
cp /home/test.service /etc/systemd/system/
启动:
systemctl start test.service
ps -ef | grep python 查看python进程会发现多了/usr/bin/python test.py的进程
当我们人为kill掉此进程的时候,systemd会自动帮我们重启此进程
启动后查看time文件就会看到每隔5秒输出时间了: tail -f /home/time
停止:
systemctl stop test.service
如果想开机启动此服务
$ systemctl enable test.service # 以上命令相当于执行以下命令,把test.service添加到开机启动中 $ sudo ln -s '/etc/systemd/system/test.service' '/etc/systemd/system/multi-user.target.wants/test.service'
systemd 实现守护进程是不是so easy 啊!比起python代码方式实现真的容易方便多了
注:现在大部分Linux衍生版本都支持systemd(如centos,deepin),部分不支持(如:Ubuntu14.04之前的版本)
查看系统是否支持systemd:
systemctl --version
如果提示未找到命令则说明系统不支持systemd
查看系统详细信息:
hostnamectl
注:由systemd起的任何服务,当我们停掉该systemd时,服务也会随之停掉
比如说,我们自己定义了一个systemd service,用来执行某python脚本,而该脚本启动mysql、nginx服务,当我们停掉该systemd service(systemctl stop xxx.service)时,mysql和nginx服务也会停(kill)掉。因为这两个服务是有systemd起的,当systemd服务停/kill掉时,由该systemd服务所起的服务或进程也会停/kill掉。