Убейте скрипт, содержащий `time.sleep()`

Я делаю заметки в классе на своем компьютере и делюсь этими заметками через общую папку на Dropbox. Когда я делаю заметки в классе, я создаю много ненужных файлов (я делаю заметки в LaTeX) перед тем, как сгенерировать PDF. Я не хочу загромождать мое место в выпадающем списке ненужными файлами и предпочел бы публиковать только 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 python или же ps -e | grep python,

Кто-нибудь есть идеи, как я могу отслеживать скрипт Python, пока он спит?
Я на Mac OSX 10.7.5 (Lion), если это имеет значение

1 ответ

Решение

Традиционный способ, которым демоны Unix справляются с этой проблемой, - это "pid-файлы".

Когда ваша программа запускается (или когда ваша программа запуска запускает вашу программу), она создает файл в известном месте (/var/run/<PROGRAM NAME>.pid для системных демонов; пользовательские демоны не имеют универсального эквивалента), записывает PID в этот файл (как в строке ASCII 12345\n для PID 12345) и удаляет его при выходе. Итак, вы можете просто kill $(cat /var/run/myprogram.pid),

Однако, похоже, вам здесь не нужно. Вы можете легко спроектировать программу так, чтобы она полностью отключалась, вместо того, чтобы убивать ее.

Или, что еще проще, удалите сон; вместо того, чтобы cron запускал ваш скрипт каждый час и оставлял сценарий в спящем режиме по одной минуте до тех пор, пока файл PDF не был создан, просто запустите скрипт при запуске PDF при запуске LaunchServices.

Другие вопросы по тегам