[英]How to append crontab entries using python-crontab module?
我想寻求有关python-crontab模块的帮助。 我有一个简单的Shell脚本,可以使用curl命令记录互联网广播流。 我想通过在crontab中安排录制来提前安排录制。 我找到了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_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被覆盖。
我试图将代码的第三行更改为radio_cron = CronTab(tabfile ='/ home / pifik / Documents / filename.tab'),它有助于将所有新条目附加在filename.tab中,但不会将任何内容写入crontab 。 我正在运行Ubuntu 14.04和Python 3.4.3。
看起来每次添加作业并将其写回时,都将覆盖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
我修改了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
以使其按预期工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.