【问题标题】:How to append crontab entries using python-crontab module?如何使用 python-crontab 模块附加 crontab 条目?
【发布时间】:2015-12-22 03:58:33
【问题描述】:

我想就 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/文件/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,job 1被覆盖。

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

【问题讨论】:

  • 这看起来很像一个错误。当然不是预期的行为。我将编写一个测试用例来尝试捕获它,待命。

标签: python linux python-3.x crontab cron-task


【解决方案1】:

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

您可以通过将其重新编写为一个类来解决该问题,该类将所有作业放在一起,然后再将它们写回。当然,这会将您描绘到您已经在其中的同一个角落,追加不起作用(除非您在编写之前再次放置旧条目):

#!/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

【讨论】:

    【解决方案2】:

    我修改了 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()
    

    【讨论】:

      【解决方案3】:

      问题是您没有为 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 添加到您的代码中,以使其按预期工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-16
        • 2010-09-19
        • 1970-01-01
        • 2017-07-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多