Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当由systemctl启动时,python子进程找不到shell命令_Python_Bash_Subprocess_Systemd_Systemctl - Fatal编程技术网

当由systemctl启动时,python子进程找不到shell命令

当由systemctl启动时,python子进程找不到shell命令,python,bash,subprocess,systemd,systemctl,Python,Bash,Subprocess,Systemd,Systemctl,当我使用systemctl启动python应用程序时,python子进程在运行标准shell命令(如tail、awk等)时失败 代码示例: import subprocess process = subprocess.Popen(['awk'], stdout=subprocess.PIPE) 保存以上内容并通过python app.py运行-没有问题 使用systemctl运行相同的命令,将出现以下错误: FileNotFoundError: [Errno 2] No such file

当我使用systemctl启动python应用程序时,python子进程在运行标准shell命令(如tail、awk等)时失败

代码示例:

import subprocess

process = subprocess.Popen(['awk'], stdout=subprocess.PIPE)
保存以上内容并通过python app.py运行-没有问题

使用systemctl运行相同的命令,将出现以下错误:

FileNotFoundError: [Errno 2] No such file or directory: 'awk': 'awk'
这同样适用于我所安装的所有其他命令,例如tail、sed等

我尝试了启动子流程的不同方法,例如
subprocess.run()
subprocess.call()
。我还尝试使用
shell=True
甚至
executable='/bin/bash
参数

对于systemctl端,我尝试使用
systemctl start service_name--user
和各种配置组合在本地运行,例如更改进程类型、以root用户、不同用户和组身份运行

以下是配置的一个示例:

[Unit]
Description={{ project_name }} Service
After=network.target

[Service]
User={{ user }}
Group={{ user_group }}

Restart=always
RestartSec=1s

WorkingDirectory=/home/{{ user }}/{{ project_folder }}
ExecStart=/home/{{ user }}/{{ project_folder }}/virtualenv/bin/python start.py

[Install]
WantedBy=multi-user.target

事实证明,python子流程正在使用PATH环境变量作为可执行文件的位置

运行systemctl时,不提供这些选项

我通过比较运行systemctl和运行python app.py时的print(os.environ)发现了这一点

在systemctl配置文件的[Service]部分添加此行:

Environment="PATH=/home/{{ user }}/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin"
这指定程序执行awk命令的环境目录

在ubuntu 20.04 LTS中,修改代码如下:

import subprocess

process = subprocess.Popen(['/usr/bin/awk'], stdout=subprocess.PIPE)

tail
已可执行;为什么要尝试使用
bash
?请在问题中提供
systemd
服务的内容。当使用systemd运行时,tail在子进程中不可执行。这就是我尝试的原因。我将很快添加systemd服务,但它相当标准。您尝试过使用
tail
的完整路径吗?这就是一切用于查找可执行文件。您还应包括
/bin
@tripleee yea我知道。我非常惊讶地发现systemctl没有提供这些功能。
import subprocess

process = subprocess.Popen(['/usr/bin/awk'], stdout=subprocess.PIPE)