我想在一小时内达到指定时间时启动 python 脚本的新实例并杀死当前实例。
python 脚本使用 crontab 在启动时自动启动。无限 while 循环读取数据。如果在第 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 $2}'`
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 脚本时,第一个启动的脚本正在执行所有“工作”,而其他脚本则处于空闲状态......
不要让进程尝试自行重新启动,而是使用一个运行真实脚本的瘦父脚本。每当脚本退出时,父监视器都会重新启动该脚本。由于父级会等到子级完全退出,因此您不会运行多个版本。在完整的实现中,父级保存您需要的任何系统守护程序代码,而子级则专注于任务。
此示例运行一个非常无聊的程序,该程序会休眠命令行指定的秒数
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)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)