【问题标题】:python os.system block backward command [closed]python os.system块向后命令[关闭]
【发布时间】:2014-10-30 03:00:54
【问题描述】:

我设置了一个计时器来监控这些代码。

def SwitchToDstSystem(SystemNo):
    grub_util.SwitchToSystem(SystemNo = SystemNo)
    logger.debug("switch to %s"%SystemNo)
    time.sleep(10)
    os.system('/usr/bin/setsid /sbin/shutdown -r now &')
    logger.debug("Reboot in 10 seconds")
    time.sleep(10)
def UpgradeGsp(StatusDict):
    SwitchToDstSystem(SystemNo)
while True:
    UpgradeGsp(SystemNo)

有时它会很快完成,但有时会超时。 我认为有时os.system 应该被屏蔽。

我的服务器运行mysql,有人知道为什么os.system被屏蔽了吗?

os.system('/usr/bin/setsid /sbin/shutdown -r now &')

【问题讨论】:

  • 这些代码在哪里?
  • os.system('/usr/bin/setsid /sbin/shutdown -r now &')
  • 请详细说明问题
  • 我想在 python 脚本中使用 os.system('/usr/bin/setsid /sbin/shutdown -r now &') 重新启动服务器,我在函数之前和之后打印了一些日志。有时命令会成功执行。但有时会在 os.system 函数中被阻塞,不会返回,也不会重启系统。
  • 请重新组织您的问题以便阅读!

标签: python linux os.system


【解决方案1】:

最近没有搞乱从代码中运行程序。但只需使用subprocess.call() 我认为您还需要root权限才能使用shutdown。

# Code not tested. If this doesn't work try the `pexpect` module
# to expect the password prompt.
import subprocess
subprocess.call('sudo shutdown -r now')

我可以写出完整的工作代码,但这需要一些时间。而且我认为你应该完成你的问题,完成挑战总是很有趣的。

我只是真正使用子进程来进行程序调用或系统信息。

Pexpect 可以通过命令行与程序进行通信。 虽然您需要自己添加期望。

Pexpect API DocumentationSpawn() 类类似于 subprocess.call()。阅读Spawn() Class Docs

(题外话:有一个由pexpect 构建的pxssh 模块。一个非常好的创建小型管理脚本的工具。

【讨论】:

  • 我同意你的看法!稍后我可能会更改我的功能。但现在我需要向客户解释原因。我需要知道为什么。
  • 抱歉帮不了你。说“这太技术性了”。我认为更改功能会对您的代码有所帮助。如果将您的代码包装在 try: ... except Exception, e: print e 中以缩小您的问题的范围没有帮助,请从那里开始。
  • 如果您需要。打开您使用的模块,在您的代码案例os 中,并在您使用的功能上放置一些try: except:。这是很多工作不经意间。但这可能非常有益。如果可以的话,当你让它工作时。我想知道你的解决方案