繁体   English   中英

作为systemd服务运行时,Python脚本不会写入文件

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM