以下Python脚本名为" tst_script.py"写在一个文件中。它在通过命令行启动时有效,但在通过系统服务启动时无法创建文件。
#!/usr/bin/python
#-*- coding: utf-8 -*-
import time
if __name__ == '__main__':
with open('test_file', 'a') as fd:
while True:
for i in range(10):
fd.write('test' + str(i) + '\r\n')
time.sleep(3)
break
名为" tst_script.service&#34的服务脚本;如下:
[Unit]
Description=Python test script
[Install]
WantedBy=multi-user.target
[Service]
Type=simple
ExecStart=/usr/bin/python -O /home/gilles/tst_script.py
服务脚本复制在" / lib / systemd / system"文件夹并激活:
sudo systemctl daemon-reload
sudo systemctl enable tst_script.service
我们通过以下方式检查服务是否已安装并启用:sudo systemctl status tst_script.service
结果是:
tst_script.service - Python test script
Loaded: loaded (/lib/systemd/system/tst_script.service; enabled)
Active: inactive (dead) since ven. 2018-03-02 13:35:00 CET; 16min ago
Main PID: 10565 (code=exited, status=0/SUCCESS)
我们通过以下方式启动服务:sudo systemctl start tst_script.service
我们检查脚本是否正在运行:sudo systemctl status tst_script.service
结果是:
tst_script.service - Python test script
Loaded: loaded (/lib/systemd/system/tst_script.service; enabled)
Active: active (running) since ven. 2018-03-02 13:51:17 CET; 1s ago
Main PID: 10738 (python)
CGroup: /system.slice/tst_script.service
└─10738 /usr/bin/python -O /home/gilles/tst_script.py
30秒后,我们检查过程是否已完成:
tst_script.service - Python test script
Loaded: loaded (/lib/systemd/system/tst_script.service; enabled)
Active: inactive (dead) since ven. 2018-03-02 13:51:47 CET; 3s ago
Process: 10738 ExecStart=/usr/bin/python -O /home/gilles/tst_script.py (code=exited, status=0/SUCCESS)
Main PID: 10738 (code=exited, status=0/SUCCESS)
但是,结果,文件" tst_file"不存在......
我用Google搜索但没有找到解决问题的答案。我找到的最接近的答案是running python script as a systemd service。
你有任何想法解决这个问题吗?
答案 0 :(得分:1)
正如丛马在评论中提到的,最明显的问题是你可能正在寻找错误的地方。在您的代码中,输出文件为:with open('test_file', 'a')
,当您测试此脚本时,该文件与脚本位于同一文件夹中。
问题是,Python不会将file_name
解释为/path/to/python/script/file_name
,而是相对于当前工作目录读取相对路径。如果您从systemd开始,您当前的工作目录与脚本所在的位置不同。
您可以通过配置服务来解决此问题,但在这种情况下更容易提供输出文件的绝对路径:
import time
if __name__ == '__main__':
with open('/home/gilles/test_file', 'a') as fd:
while True:
for i in range(10):
fd.write('test' + str(i) + '\r\n')
time.sleep(3)
break
如果您更喜欢使用该服务,则可以更改systemd的工作目录。此信息可能会有所帮助:Changing Working Directory of systemd service