2016-03-06 2 views
0

Я хочу запустить новый экземпляр моего скрипта python, когда он достигнет указанного времени в течение часа и убьет текущий экземпляр. Сценарий python запускается автоматически при загрузке с помощью crontab. Бесконечный цикл while считывает данные. Если есть данные, входящие между минутой 59 секунд 30 и минутой 59 секунд 59, файл закрывается, и я хочу, чтобы скрипт начал новый экземпляр себя с новым идентификатором процесса и убил старый процесс. На данный момент я делаю это с помощьюскрипт python, чтобы убить и начать сам

subprocess.call(['python', '/home/pi/script.py']) 
    sys.exit(1) 

Это запускает новый экземпляр сценария питона, но старая еще видим и (кажется) активны, когда я проверяю процессы с top.

Есть ли лучший способ запустить программу и убить себя внутри скрипта python?

Другой подход с использованием Баш скрипт с помощью сценария Python:

#!/bin/sh 

PID=`ps -eaf | grep python | grep -v grep | awk '{print $2}'` 
if [[ "" != "$PID" ]]; then 
    echo "killing $PID" 
    kill -9 $PID 
    sleep 1 
    sudo python /home/pi/readserial_V4_RP.py & 
    exit 1 
fi 

Но это не может работать, так как конечный сценарий питона, до того, как скрипт Баш может убить его. Я могу запустить скрипт python, не убивая python процессов, но как я могу быть уверен, что скрипт python не запущен, прежде чем я запустил новый экземпляр скрипта python.

, потому что у меня есть чувство, когда у меня есть более чем один же питон сценарии, работающие, что первый один, который был начат делает все «работать», а остальные только в режиме ожидания ...

ответ

0

лучше всего было бы использовать:

child = subprocess.Popen(['python','/home/pi/script.py'],shell=True,stdout=subprocess.PIPE) 
    output,error = child.communicate() 
    print output, error 
    sys.exit() 
+0

Thx! Я тоже пробовал его с помощью 'shell = True', но с тем же результатом. Я думаю, stdout дает мне журнал, где я могу видеть ошибки, если они есть? Или что он делает? – BallerNacken

+0

Связь() не возвращается, пока процесс не завершится. Если вы хотите контролировать процесс, используйте poll() и периодически проверяйте содержимое вывода. Когда пришло время убить процесс, внешний скрипт может использовать kill(). – Neil

+0

@Henin RK Ваш подход не работает. Текущий процесс завершается, но сценарий не запускается снова. Правильно ли, что так, как я это делаю в настоящий момент, старый экземпляр скрипта python является родительским процессом, и ребенок может быть убит только в том случае, если заканчивается родительский элемент? Я отредактировал сценарий bash в моем вопросе с другим подходом и проблемой. – BallerNacken

0

Вместо того, чтобы процесс попытаться перезапустить себя, иметь тонкий родительский скрипт, который запускает реальный сценарий. Родительский монитор просто перезапускает скрипт всякий раз, когда он выходит. Поскольку родитель ждет, пока ребенок полностью не выйдет, вы не будете запускать несколько версий. В полной реализации родительский элемент содержит любой системный код демона, который вам нужен, и ребенок фокусируется на задаче.

Этот пример работает очень скучную программу, которая спит на количество секунд, указанное в командной строке

import multiprocessing 
import time 
import sys 
import os 
import traceback 

def the_real_work_done_here(sleep_time): 
    try: 
     print(os.getpid(), 'start work') 
     time.sleep(sleep_time) 
     print(os.getpid(), 'end work') 
     exit(0) 
    except Exception: 
     traceback.print_exc() 
     exit(2) 

def monitor(sleep_time): 
    while 1: 
     proc = multiprocessing.Process(target=the_real_work_done_here, 
      args=(sleep_time,)) 
     proc.start() 
     proc.join() 
     if proc.exitcode != 0: 
      print('something went wrong... terminating') 
      exit(proc.exitcode) 


if __name__ == '__main__': 
    try: 
     sleep_time = int(sys.argv[1]) 
     monitor(sleep_time) 
    except (KeyError, ValueError): 
     print('usage: test.py sleeptime') 
     exit(1) 
+0

Это выглядит очень полезно. Я постараюсь сделать это завтра и дать ответ. Thx пока ребята! – BallerNacken

Смежные вопросы