我希望在一小时内到达指定时间时启动我的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 $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脚本运行时,第一个启动的是执行所有“工作”而其他人正处于空闲状态...
答案 0 :(得分:0)
更好的方法是使用:
child = subprocess.Popen(['python','/home/pi/script.py'],shell=True,stdout=subprocess.PIPE)
output,error = child.communicate()
print output, error
sys.exit()
答案 1 :(得分:0)
不要让进程尝试重新启动,而是使用运行真实脚本的瘦父脚本。父监视器只要退出就会重新启动脚本。由于父母一直等到孩子完全退出,你就不会有多个版本在运行。在完整实现中,父级保存您需要的任何系统守护程序代码,并且子级专注于该任务。
此示例运行一个非常无聊的程序,该程序在命令行中指定的秒数
private void refreshData() {
dbProducts.clear();
dba = new DatabaseHandler(getApplicationContext());
ArrayList<MyProduct> productsFromDB = dba.getProducts();
for (int i = 0; i < productsFromDB.size(); i++){
String productName = productsFromDB.get(i).getProductName();
int productNumber = productsFromDB.get(i).getProductNumber();
Double productTons = productsFromDB.get(i).getProductWeight();
Double productTrucks = productsFromDB.get(i).getProductQTY();
//String productDate = productsFromDB.get(i).getProductBirthDate();
long productDate = productsFromDB.get(i).getProductDate();
MyProduct myProduct = new MyProduct();
myProduct.setProductName(productName);
myProduct.setProductNumber(productNumber);
myProduct.setProductTons(productWeight);
myProduct.setProductTrucks(productQTY);
myProduct.setProductDate(productDate);
//myJob.setProductDate(ProductDate);
dbProducts.add(myProduct);
}
答案 2 :(得分:0)
我知道这是一篇旧帖子,但我需要一种方法来重新启动进程但杀死旧进程。 它适用于 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()