0

我在课堂上用电脑记笔记,并通过保管箱上的公共文件夹分享这些笔记。当我在课堂上做笔记时,我会在生成 PDF 之前创建很多不必要的文件(我在 LaTeX 中做笔记)。我不想用不必要的文件将我的 Dropbox 空间弄得一团糟,而宁愿只将 PDF 发布到 Dropbox。

为了方便所有这些,我设置了一个 cronjob,它在每节课后(每周)运行一个 python 脚本(下)。有时,在导出 PDF 之前,我会在笔记中修复某些内容时会留几分钟,因此 python 脚本中有一堆sleeps,等待生成 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 pythonor ps -e | grep python

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

4

1 回答 1

1

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

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

但是,这里似乎不需要这个。您可以轻松地将程序设计为完全关闭,而不是将其设计为可杀死的。

或者,更简单的是,消除睡眠;与其让 cron 每小时运行一次脚本并让脚本一次休眠一分钟,直到创建 PDF 文件,不如让 LaunchServices 在创建 PDF 时运行脚本。

于 2013-10-03T23:43:33.563 回答