Python для отправки команды через другой процесс, ожидания завершения процесса и перезагрузки системы? - PullRequest
1 голос
/ 04 апреля 2019

Я использую сервер Minecraft для моих друзей и отключил Raspberry Pi. Помимо лагов (из-за моего интернета, а не аппаратного обеспечения) сервер работает без сбоев, однако, мой Pi хочет отключаться очень часто (если консоль сервера падает, или экран решает закрыть этот сеанс и т. Д.) , Я хочу создать скрипт на python, который будет запускаться каждый день в полночь и полдень, чтобы выдавать несколько команд через консоль сервера и саму пи.

Доступ к консоли сервера осуществляется через screen -r Minecraft, поэтому я могу закрыть сеанс SSH и оставить сервер работающим. Если сервер не запущен, его можно запустить с ./minecraft.sh.

Вот, по сути, то, что я хочу сделать: (Извините, я знаю очень мало Python, кроме того, что мне нужно для навигации по консоли Pi) (Я больше знаком с C #, поэтому мне жаль, если мой код больше похож на этот, а не Python) Примечание: Команды, введенные на экране консоли сервера -r minecraft, не требуют кавычек вокруг текста без команд I.E. Say Words будет отправлять слова в игровой чат, а Say Words - отправлять слова в игровой чат.

//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 голосов
/ 04 апреля 2019

Я думаю, что следующие примеры могут помочь:

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...