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

#python #debian

#python #debian

Вопрос:

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

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

Вот, по сути, что я хочу сделать: (Извините, я очень мало знаю python, кроме того, что мне нужно для навигации по консоли pi) (я больше знаком с C #, поэтому прошу прощения, если мой код больше похож на это, а не на Python) Примечание: Команды, выдаваемые на экран консоли сервера -r minecraft, не требуют кавычек вокруг некомандного текста, т.е. 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 запускает сервер под screen -r Minecraft, чтобы я мог добраться до него позже)

Правка: правописание, объяснение на C #, лучший код. Редактировать: Описания команд Minecraft, добавленные объявления и состояние сохранения.

Комментарии:

1. Ну, вы можете написать скрипт, который запускает подпроцесс. Popen([‘ваш’, ‘сервер’, ‘команда’]) каждые 12 часов

2. Такая простая логика может быть легко выполнена с помощью cron вместо python. Вы думали об использовании cron? Часть уничтожения также довольно проста с помощью сценариев bash. pkill -f minecraft

3. @ThuYeinTun да, это сработало бы, однако я хочу запустить команду stop на сервере, а не просто останавливать процесс. Я хочу, чтобы все сохраненные материалы были запущены. И мне нужно было бы объявить в игровом чате, что происходит завершение работы.

4. @ArtiomKozyrev будет ли это работать, как subprocess.Popen(screen -r Minecraft; stop); , а затем ждать завершения процесса screen -r Minecraft для перезагрузки pi? Извините, я не могу ничего протестировать на своем Pi прямо сейчас, потому что он отключен и по какой-то причине не будет автоматически восстанавливаться, поэтому я не могу подключиться к нему по SSH, как обычно.

5. @Gagewillson Я привел пример, он связан с win, может сделать то же самое в Unix, в Unix проще выполнить несколько команд подряд: import subprocess encoding = ‘latin1’ p = подпроцесс. Popen(‘cmd.exe ‘, stdin=подпроцесс. КАНАЛ, стандартный вывод= подпроцесс. КАНАЛ, stderr= подпроцесс. КАНАЛ, оболочка= True) cmds = [] cmds.append(«cd C:\UsersLOL\Desktop \ n») cmds.append(«dir n») cmds.append(«ping 127.0.0.1 n») cmds.append(«ping 127.0.0.2 n») для cmd в cmds: p.stdin.write(cmd.encode(‘utf-8’)) p.stdin.close() печать(p.stdout.read(). декодирование (‘ansi’))