在 Python 脚本中运行 systemctl

在 Python 脚本中运行 systemctl

我尝试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)

后一种形式允许嵌入空间的参数。

相关内容