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()
我想在我的 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()