python脚本杀死并开始自己

时间:2016-03-06 19:13:57

标签: python subprocess kill restart

我希望在一小时内到达指定时间时启动我的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脚本运行时,第一个启动的是执行所有“工作”而其他人正处于空闲状态...

3 个答案:

答案 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()