Python通过另一个进程发送命令,等待进程终止,然后重新启动系统?

时间:2019-04-04 14:03:51

标签: python debian

我正在为我的朋友们运行Minecraft服务器,而我是从Raspberry Pi开始的。除了延迟(由于我的互联网,而不是硬件),服务器运行平稳,但是,我的Pi希望经常关闭(如果服务器控制台崩溃,或者屏幕决定关闭该会话等)。 。我想做的是创建一个每天在午夜和正午运行的python脚本,以通过服务器控制台和pi本身发出一些命令。

可以通过screen -r Minecraft访问服务器控制台,因此我可以关闭SSH会话并使服务器保持运行状态。如果服务器未运行,则可以使用./minecraft.sh启动它。

本质上是我想做的:(对不起,除了导航pi控制台所需的内容外,我对python的了解很少)(我对C#更加熟悉,所以很抱歉,如果我的代码更类似于该代码而不是类似代码)蟒蛇) 注意:发出到服务器控制台屏幕-r minecraft的命令不需要在非命令文本I.E周围加引号。说单词会将单词发送到游戏聊天,但说“单词”会将“单词”发送到游戏聊天。

//SafeShutDown.py
//This code is in no way executable. I just typed it out as an outline. A lot is wrong with it I'm assuming.

Loop A;
If dateTime.Now == 12:00 or dateTime.Now == 24:00 { 
    screen -r Minecraft
    say Server saving... //In minecraft console. Announces to players
    autosave all //In minecraft console. Plugin to save the world
    say Server is restarting in 1 minute. Please wait //In Minecraft console
    wait 60s //In python
    stop //Command to send within the process "Minecraft" to shutdown server

    wait for process "Screen -r Minecraft" to terminate //This is what I need help with
    reboot
Else { Go To A;}

// Other scripts here that starts at boot to run ./minecraft.sh and ./SafeShutDown.py from /home/Minecraft.

我试图让脚本在启动时运行无济于事。 Minecraft.sh应该在引导时运行,因此如果崩溃,它仍然会运行(Minecraft.sh在-r Minecraft屏幕下启动服务器,以便我稍后再访问)

编辑:拼写,C#解释,更好的代码。 编辑:Minecraft命令的描述符,添加了公告并保存了状态。

1 个答案:

答案 0 :(得分:0)

我想以下示例可能会有所帮助:

import subprocess
import time


def infinite_stuff():
    while True:
        do_work()
        time.sleep(60) # time in seconds, so event take place each 60 seconds


def do_work():
    p = subprocess.Popen('cmd.exe', stdin=subprocess.PIPE, stdout=subprocess.PIPE, 
    stderr=subprocess.PIPE, shell=True)
    cmds = []
    cmds.append("cd C:\\Users\LOL\\Desktop\\ \n")
    cmds.append("dir \n")
    cmds.append("ping 127.0.0.1 \n")
    cmds.append("ping 127.0.0.2 \n")
    for cmd in cmds:
        p.stdin.write(cmd.encode('utf-8'))
    p.stdin.close()
    print(p.stdout.read().decode('ansi'))


if __name__ == '__main__':
    infinite_stuff()