systemd實現python的守護程序
守護程序(Daemon)是執行在後臺的一種特殊程序。它獨立於控制終端並且週期性地執行某種任務或等待處理某些發生的事件。(摘自百度百科)
之前有轉過一遍python實現守護程序方法的部落格,這次我們看看用systemd是如何實現的。
有關systemd的介紹和使用推薦阮一峰老師的以下兩篇部落格,寫的非常詳細和全面
下面我們看看用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
/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掉。