[英]Python Popen doesn't recognize scrapy when python script is run as systemd service
[英]Python script doesn't write to file when run as a systemd service
以下名为“ tst_script.py”的Python脚本将写入文件。 它通过命令行启动时有效,但通过systemd服务启动时无法创建文件。
#!/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”的服务脚本如下:
[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”不存在...
我用谷歌搜索,但没有找到解决我问题的答案。 我发现最接近的答案是将python脚本作为systemd服务运行 。
你有解决这个问题的主意吗?
正如丛马(Cong Ma)在评论中提到的那样,最明显的问题是您看错了地方。 在您的代码中,您的输出文件为: 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的工作目录。 此信息可能会有所帮助: 更改systemd服务的工作目录
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.