python 杀死并启动自身的脚本

python script to kill and start itself

我想在我的 python 脚本到达指定时间时启动一个新实例并终止当前实例。 python 脚本使用 crontab 随引导自动启动。无限循环读取数据。如果在第 59 秒 30 和第 59 秒 59 之间有数据传入,文件将关闭,我希望脚本使用新进程 ID 启动自身的新实例并终止旧进程。目前我正在使用

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

这会启动 python 脚本的一个新实例,但是当我使用 top 检查进程时,旧的仍然可见并且(看起来)处于活动状态。

有没有更好的方法让程序在python脚本中启动并自行终止?

另一种方法 使用由 python 脚本调用的 bash 脚本:

#!/bin/sh

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

但这行不通,因为 python 脚本在 bash 脚本可以终止它之前结束。我可以在不杀死 python 的情况下启动 python 脚本 进程,但是在启动 python 脚本的新实例之前,我如何确定没有 python 脚本是 运行。

因为我有这样的感觉,当我有多个相同的 python 脚本时 运行,第一个启动的脚本正在执行所有 "work",其他的都是闲置中...

更好的方法是使用:

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

与其让进程尝试自行重启,不如使用一个精简的 parent 脚本来运行真正的脚本。 parent 监视器在脚本退出时只是重新启动脚本。由于 parent 会等到 child 完全退出,因此您不会有多个版本 运行。在完整的实现中,parent 包含您需要的任何系统守护程序代码,而 child 专注于任务。

此示例运行一个非常无聊的程序,该程序会休眠命令行指定的秒数

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)

我知道这是一个旧的 post,但我需要一种方法来重新启动进程但终止旧的。 它适用于 creationflags=subprocess.DETACHED_PROCESS.

test.py

from time import sleep
import subprocess
import sys

print("Start")
sleep(1)

print("Start New")
child = subprocess.Popen(['python','test.py'],creationflags=subprocess.DETACHED_PROCESS)
sleep(1)

sys.exit()