【问题标题】:File not found after a directory copy目录复制后找不到文件
【发布时间】:2018-01-11 17:40:37
【问题描述】:

我正在尝试使用 Python 创建一个安装脚本,以使用 systemd 创建一个守护进程。

安装脚本的摘录:

....
# Copy ProcessManager directory into /usr/local/bin/
print('Copy sources into /usr/local/bin')
os.system('cp -r ' + processManagerPath + ' /usr/local/bin')

fileContent =   '[Unit] \n' \
                'Description=ProcessManager \n' \
                'After=tlp-init.service \n\n' \
                '[Service] \n' \
                'Type=oneshot \n' \
                'RemainAfterExit=no \n' \
                'ExecStart=/usr/bin/python /usr/local/bin/ProcessManager/gobatch.py \n\n' \
                '[Install] \n' \
                'WantedBy=multi-user.target'

file = open('/etc/systemd/system/processManager.service', 'w')
file.write(fileContent)
file.close()
....

但是,当我使用以下命令启动我的守护程序时:sudo systemctl status processManager.service 我收到此错误:

    stringToSend = convertFileToString()
  File "/usr/local/bin/ProcessManager/gobatch.py", line 23, in convertFileToString
    fbatchContent = readFile()
  File "/usr/local/bin/ProcessManager/gobatch.py", line 13, in readFile
    with open("FBatch", "r") as f:
IOError: [Errno 2] No such file or directory: 'FBatch'

当我列出 /usr/local/bin/ProcessManager 时,内容是:

FBatch  findCommand.py  gobatch.py  install.py  Programs.md  UpdateFBatchFile.py

关于cp -r 存在一些我不知道的东西?还是关于特权?

感谢您的帮助!

【问题讨论】:

  • 你确定工作目录是/usr/local/bin/ProcessManager吗? with open("FBatch", "r") as f: 将尝试在当前工作目录中打开一个文件。
  • 是的,我想是因为我的命令 exec 是 ExecStart=/usr/bin/python /usr/local/bin/ProcessManager/gobatch.py。我错了吗?
  • 我建议将完整路径放在文件名的参数中或使用print(os.cwd())进行调试
  • 我收到一个错误:AttributeError: 'module' object has no attribute 'cwd'。与os.pwd 的结果相同。当我打印 os.system('pwd') 时,除了错误之外什么都没有发生......并且文件直接用 nano 更新。
  • 对不起,是os.getcwd();我的错误

标签: python linux systemd


【解决方案1】:

当您尝试with open("FBatch", "r") as f: 时,它不会尝试打开/usr/local/bin/ProcessManager 中的文件,因为它不是当前工作目录。相反,它会尝试在其他地方打开它。在这种情况下,它试图打开根目录/中的文件。

您必须为所有open 调用提供完整路径,或者使用os.chdir(path) 一次来更改当前工作目录。

【讨论】:

  • 在我的脚本开头使用os.chdir(/usr/local/bin/ProcessManager) 似乎有效!谢谢!
【解决方案2】:

正如大家已经指出问题出在当前工作路径上,您可以在 python 脚本中使用os.chdir 来解决它,或者您可以在单元文件中指定WorkingDirectory,使其看起来像:

fileContent =   '[Unit] \n' \
            'Description=ProcessManager \n' \
            'After=tlp-init.service \n\n' \
            '[Service] \n' \
            'Type=oneshot \n' \
            'WorkingDirectory=/usr/local/bin/ProcessManager\n' \
            'RemainAfterExit=no \n' \
            'ExecStart=/usr/bin/python /usr/local/bin/ProcessManager/gobatch.py \n\n' \
            '[Install] \n' \
            'WantedBy=multi-user.target'

如果您不希望脚本在重新启动后仍然存在,您可以使用pystemd 库来启动临时单元。

import pystemd.run

pystemd.run([b'/usr/bin/python', b'/usr/local/bin/ProcessManager/gobatch.py'], cwd=b'/usr/local/bin/ProcessManager')

平心而论,您可以使用 systemd-run 命令行工具来做同样的事情

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-07
    • 1970-01-01
    相关资源
    最近更新 更多