如何使用 python-crontab 模块附加 crontab 条目?

How to append crontab entries using python-crontab module?

我想寻求有关 python-crontab 模块的帮助。我有一个简单的 shell 脚本来使用 curl 命令录制互联网广播流。我想通过在 crontab 中安排录制来提前安排录制。我找到了允许我直接写入 crontab 的 python-crontab 模块。但是每次我安排新的记录时,旧的 crontab 条目都会被覆盖。是否可以使用 python-crontab 编写持久性 crontab 条目?

我简化了我的代码来演示我的问题:


from crontab import CronTab

def get_recording_parameters(Min,Hour,day,month,job_number):
    radio_cron = CronTab()
    cmd = "sh /home/pifik/Documents/record_radio.sh"
    cron_job = radio_cron.new(cmd, comment='job_'+str(job_number))
    cron_job.setall(Min, Hour, day, month, None)   
    radio_cron.write()

如果我 运行 它带有以下参数:get_recording_parameters(0,22,23,12,1),并使用 crontab -l 命令检查终端中的 crontab 我得到 0 22 23 12 * sh /home/pifik/Documents/record_radio.sh # job_1。 如果我 运行 它再次使用不同的参数,例如: get_recording_parameters(10,23,25,12,2) 并使用 crontab -l 检查 crontab 我得到 10 23 25 12 * sh /home/pifik/Documents/record_radio.sh # job_2,作业1被覆盖.

我试图将第 3 行代码更改为 radio_cron = CronTab(tabfile='/home/pifik/Documents/filename.tab') 并且它有助于将所有新条目附加到 filename.tab 但没有任何内容写入 crontab。 我是 运行宁 Ubuntu 14.04 和 Python 3.4.3.

看起来每次添加作业并将其写回时都会覆盖 crontab 中已有的内容。我阅读了文档,但无法从中得出结论。看来您应该能够阅读已经存在的内容并添加到其中,但对于我来说,我无法从文档中弄清楚如何做。

您可以通过将其重新处理为 class 来解决该问题,该 class 将所有作业放在一起,然后再将它们写回。当然,把你画到你已经在的同一个角落是行不通的(除非你在写之前再次放置旧条目):

#!/home/sklassen/py/try-pycrontab/env/bin/python
from crontab import CronTab

class CronSet:
    def __init__(self):
        self._crontab = CronTab()

    def add_job(self, min, hour, day, month, job_number):
        cmd = "sh /home/pifik/Documents/record_radio.sh"
        job = self._crontab.new(cmd, comment='job'+str(job_number))
        job.setall(min, hour, day, month, None)

    def save(self):
        self._crontab.write()


def main():
    c = CronSet()
    c.add_job(0, 22, 23, 12, 1)
    c.add_job(0, 23, 23, 12, 2)
    c.save()

if __name__ == '__main__':
    main()


# running 'crontab -l' produces the following
# 0 22 23 12 * sh /home/pifik/Documents/record_radio.sh # job1
# 0 23 23 12 * sh /home/pifik/Documents/record_radio.sh # job2

我修改了 Steven 的代码以使其适用于我。 为了不丢失之前计划的 crontab 作业,我创建了一个 cron_jobs.txt 文件,并使用子进程调用 "crontab -l > /home/pifik/Documents/cron_jobs.txt" 将所有现有的计划作业从 crontab 复制到 cron_jobs.txt。每次我这样做时,我都会覆盖文件中的所有内容。然后我创建一个新的记录作业并将其附加到 cron_jobs.txt 文件。之后我用 运行 "subprocess.call('crontab /home/pifik/Documents/cron_jobs.txt', shell=True)".

覆盖了 crontab

这是使其工作的解决方法,但我仍然想知道是否可以使用 python-crontab 模块直接附加新作业而不需要 cron_jobs.txt文件。可以说,按照我现在的方式,它也可以在没有模块的情况下完成,但模块使我更容易通过激活或停用它们以及删除过期的作业来进一步管理作业。我将在上面放一些 tkinter GUI,现在就完成了。

import subprocess
from crontab import CronTab

class CronSet:
    def __init__(self):
        self._crontab = CronTab(tabfile="/home/pifik/Documents/cron_jobs.txt")

    def add_job(self, minute, hour, day, month, title):
        subprocess.call('crontab -l > /home/pifik/Documents/cron_jobs.txt', shell=True)        
        choice=input('''1. Cesky Rozhlas 1
2. Cesky Rozhlas 2
Enter your choice (1 or 2):  ''') 
        length = int(input("Enter the length of recording in minutes: "))*60
        if choice ==str(1):
            stream = "http://amp.cesnet.cz:8000/cro1-256.ogg"
        else:
            stream = "http://amp.cesnet.cz:8000/cro2-256.ogg"
    cmd = "curl %s -m %i -o /home/pifik/Documents/Recordings/%s.ogg" %(stream, length, title)
        job = self._crontab.new(cmd, comment=title)
        job.setall(minute, hour, day, month, None)

    def save(self):
        self._crontab.write()

def main():
    c = CronSet()
    month = input("Enter month(1-12): ")
    day = input("Enter day(1-31): ")
    hour = input("Enter hour(0-24): ")
    minute = input("Enter minute(0-59): ")
    title = input("Enter title of recording: ")
    c.add_job(minute, hour, day, month, title)
    c.save()
    subprocess.call('crontab /home/pifik/Documents/cron_jobs.txt', shell=True)

if __name__ == '__main__':
    main()

问题是您没有为 CronTab 指定加载的任何用户名或文件名。所以它没有。错误是默认情况下它会向用户写出空的 crontab,即使您没有指定用户也是如此。

现有文档说:

from crontab import CronTab
empty_cron    = CronTab()
my_user_cron  = CronTab(user=True)
users_cron    = CronTab(user='username')

这是正确的,因为您正在制作一个空的 crontab。因此,我已经继续进行修复和测试,以确保如果您尝试在不指定用户或文件名的情况下编写 empty_cron,它会导致错误。

请将 user=True 添加到您的代码中,以使其按预期工作。