【问题标题】:How to use subprocess.call to restart a service in linux?如何使用 subprocess.call 在 linux 中重新启动服务?
【发布时间】:2019-06-03 19:33:47
【问题描述】:

我想使用 subprocess.call 重新启动 nginx。我正在使用

subprocess.call("sudo systemctl restart nginx",shell=True)

但是,当使用shell=True 时,该命令没有执行任何操作,而我使用shell=False 它说没有目录或文件“命令我在按钮中实现了 subprocess.call。

【问题讨论】:

  • 不过,我们不知道为什么会失败。 subprocess.check_call(["sudo", "-l"]) 成功了吗?如果前面有 GUI,sudo 没有好办法向你询问密码。
  • @tripleee 我尝试了你给我的命令,服务器没有响应这样的文件或目录“sudo”。每次我放下 shell=False 他们总是不返回这样的文件或目录。我试图调用 ("./file.sh",shell=True) 我制作的包含重启命令的 shellscript,它返回非零退出状态 127。当使用 shell=False 时,它​​不返回这样的文件...
  • 如果您没有安装sudo 命令,这当然可以解释为什么您无法运行此代码。
  • 同样,对于shell=False,您需要自己将其拆分为一个列表。但是标记 ./ 不是带有或不带有 shell 的有效语法。你的意思是"./file.sh"?使用shell=False 运行它的方法是subprocess.call(["./file.sh"]);请注意我是如何手动将命令转换为令牌列表的(当然,因为只有一个令牌,所以列表也只是一项)。
  • @tripleee 对不起,现在我明白了。我试了一下,它没有返回错误,但服务本身没有重新启动。

标签: python linux nginx subprocess


【解决方案1】:

shell=Trueshell=False 在类 Unix 系统上的区别在于 shell 负责为exec 分解命令行,而如果您没有 shell,则必须这样做自己。

shell 在这里没有任何好处,所以你可以放心地放下它。

subprocess.call(["sudo", "systemctl", "restart", "nginx"])

所以在一般情况下,任何看起来像的东西

subprocess.something("blah 'blah' \"blah\"", shell=True)

需要转换成没有shell引用的列表才能在没有shell=True的情况下运行它:

subprocess.something(['blah', 'blah', "blah"])

当然,任何特定于 shell 的东西(重定向、管道、通配符等)都需要用本机 Python 代码替换。

更多详情请访问Actual meaning of 'shell=True' in subprocessRunning Bash commands in Python

如果您的原始代码不起作用,那么这也可能不起作用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-23
    • 2021-08-07
    • 1970-01-01
    • 2015-10-28
    • 2016-07-02
    • 2017-12-29
    • 1970-01-01
    相关资源
    最近更新 更多