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

2024-09-28 01:30:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我想向crontab请求python模块的帮助。我有一个简单的shell脚本,可以使用curl命令录制internet广播流。我想提前安排录音。我找到了python crontab模块,它允许我直接写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_参数(0,22,23,12,1),并用crontab-l命令检查终端中的crontab,那么我得到0 22 23 12*sh/home/pifik/Documents/record_收音机.sh#工作1。 如果我用不同的参数再次运行它,例如:get_recording_parameters(10,23,25,12,2)并用crontab-l检查crontab,我得到10 23 25 12*sh/home/pifik/Documents/record_收音机.sh#作业2,作业1被覆盖。在

我试图将第三行代码改为radio_cron=CronTab(tabfile='/home/pifik/Documents)/文件名.tab'并且所有新条目都被附加到文件名.tab但是没有写入crontab。 我正在运行ubuntu14.04和python3.4.3。在


Tags: 模块home参数getshjob条目record
3条回答

我修改了史蒂文的代码,使之适合我。 为了不丢失先前计划的crontab作业,我创建了cron_作业.txt将所有现有的计划作业从crontab归档并复制到cron_作业.txt子流程调用“crontab-l>;/home/pifik/Documents/cron”_作业.txt". 每次我这样做,我都会覆盖文件中的所有内容。然后我创建一个新的录制作业并将其附加到cron_作业.txt文件。之后,我通过运行subprocess.call('crontab/home/pifik/Documents/cron_作业.txt“,shell=True)”。在

这是一种解决方法,可以让它正常工作,但是我仍然有兴趣知道是否可以使用python crontab模块直接附加新的作业,而不需要cron_作业.txt文件。可以说,按照我现在这样做的方式,也可以不使用模块来完成,但模块通过激活或停用作业以及删除过期作业,使我更容易进一步管理作业。我会在上面放一些小图形,现在就搞定了。在

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中已经存在的内容。我看了文件,弄不清头绪。我不知道你应该怎么去补充我的生活。在

您可以通过将它重新作为一个类来解决这个问题,该类将所有作业组合在一起,然后再将它们写出来。当然,这会把你画到你已经在其中的一个角落里进行附加是行不通的(除非你在写作之前再把旧条目放进去):

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

问题是您没有为CronTab指定任何要从中加载的用户或文件名。错误在于,默认情况下,它会将空的crontab写出给用户,即使您没有指定用户。在

现有文件指出:

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

这是正确的,因为你正在生成一个空的crontab。因此,我已经提交了一个修复程序和一个测试,以确保如果您试图在不指定用户或文件名的情况下编写一个空的\u cron,它会导致错误。在

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

相关问题 更多 >

    热门问题