我尝试systemd
用 Python 获取一些服务的状态,但一直收到错误FileNotFoundError: [Errno 2] No such file or directory: 'systemctl show -p ActiveState --value abc'
我正在以用户身份运行 Ubuntu 20.04 user
。该abc.service
文件位于/etc/systemd/system/
,详细信息如下:
-rw-rw-r-- 1 root root 1542 Aug 5 17:31 abc.service
脚本是
import subprocess
status = subprocess.check_output("systemctl show -p ActiveState --value abc")
print(status)
但是,如果我直接运行systemctl
命令,我可以获得状态。我在脚本中active
尝试过,但出现了同样的错误。sudo
与此相关,我以为我最终必须使用 来运行该命令sudo
,但实际上我是作为 Airflow dag 的一部分来运行该命令的(即,不是作为我可以执行的单独脚本sudo python3 myscript.py
)。 有办法做到这一点吗?
答案1
我粗心了,没有将其包含shell=True
在我的 中subprocess
。一旦我添加它,它就可以成功运行。
status = subprocess.check_output("systemctl show -p ActiveState --value abc", shell=True)
答案2
失败的原因是因为subprocess
函数需要一个表示可执行文件全名的完整字符串,或者args
其中第一个参数是可执行文件的名称的列表。
错误信息是提示:
No such file or directory: 'systemctl show -p ActiveState --value abc'
注意单引号之间的内容;Python 正在寻找一个名为systemctl show -p ActiveState --value abc
(包括空格)的可执行文件。
相反,您应该将第一个参数拆分.check_output
成一个列表。
如果所有参数都没有嵌入空格,则可以这样做:
argv = "systemctl show -p ActiveState --value abc".split()
status = subprocess.check_output(argv)
或者,直接写出来:
argv = ["systemctl", "show", "-p", "ActiveState", "--value", "abc"]
status = subprocess.check_output(argv)
后一种形式允许嵌入空间的参数。