目录副本后找不到文件

时间:2018-01-11 17:40:38

标签: python linux systemd

我正在尝试使用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的内容?还是关于特权?

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

由于每个人都已经指出问题出在当前的工作路径上,你可以在你的python脚本中用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' 所以它看起来如此像:

import pystemd.run

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

如果您不希望脚本在重新启动后继续存在,您可以使用pystemd库来启动瞬态单元。

{{1}}

平心而论,您可以使用systemd-run命令行工具

执行相同的操作