杀死包含`time.sleep()`的脚本

时间:2013-10-03 23:33:56

标签: python sleep kill

我在计算机上课堂上做笔记,并通过Dropbox上的公共文件夹分享这些笔记。当我在课堂上做笔记时,我会在生成PDF之前创建大量不必要的文件(我在LaTeX中做笔记)。我不想用不必要的文件弄乱我的Dropbox空间,而只想将PDF发布到Dropbox。

为了方便所有这些,我设置了一个cronjob,它在每个类(每周)之后运行一个python脚本(下面)。有时候,在导出PDF之前,我在笔记中修复了一些内容,因此python脚本中有一堆sleep,等待生成PDF。我今天不小心手动运行了这个脚本,需要帮助停止它。

import os
import subprocess

from sys import exit as crash
from datetime import date as dt
from time import sleep

def getToday():
 answer = dt.strftime(dt.today(), "%b") + str(int(dt.strftime(dt.today(), "%d")))
 return answer

def zipNotes(date):
 today = getToday()
 while 1:
  if today not in os.listdir('.'):
   with open("FuzzyLog", 'a') as logfile:
    logfile.write("Sleeping\n")
   sleep(60*5) # sleep 5 minutes
   continue
  if "Notes.pdf" not in os.listdir(today):
   with open("FuzzyLog", 'a') as logfile:
    logfile.write("pdf not exported. Sleeping\n")
   sleep(60*5) # sleep 5 minutes
   continue

  subprocess.call("""zip Notes.zip */Notes.pdf""", shell=True)
  crash(0)

zipNotes(getToday())

由于脚本找不到今天制作的任何文件(我可以很容易地创建一个虚拟文件,但这不是一个“正确的”解决方案),它会无限地循环通过睡眠条件。由于循环条件非常简单,因此我不能指望该过程长时间处于活动状态以“在行为中捕获它”以使其PID被杀死。

ps aux | grep python没有告诉我哪个PID正在运行我要杀死的python脚本,ps -ax | grep pythonps -e | grep python也没有。

有没有人知道如何在睡眠时跟踪python脚本? 我在Mac OSX 10.7.5(Lion)上,如果重要的话

1 个答案:

答案 0 :(得分:1)

Unix守护程序处理此问题的传统方式是使用“pid文件”。

当程序启动时(或启动程序启动程序时),它会在一个众所周知的位置创建一个文件(/var/run/<PROGRAM NAME>.pid用于系统守护程序;每用户守护程序没有通用等效项),将PID写入该文件(如PID 12345的ASCII字符串12345\n),并在退出时将其删除。所以,你可以kill $(cat /var/run/myprogram.pid)

但是,这似乎不需要你。您可以轻松地将程序设计为干净关闭,而不是将其设计为可以填充。

或者,更容易,取消睡眠;而不是让cron每小时运行一次脚本并让脚本一次睡眠一分钟直到创建PDF文件,只需让LaunchServices在创建PDF时运行脚本。

相关问题