Python:如何处理'crontab'命令?

时间:2015-05-19 06:24:41

标签: python linux ubuntu cron crontab

我们知道crontab命令用于Linux中的计划任务。

我想写一个Python脚本。它的功能是接收一些数据(这些数据与crontab设置有关)并执行'crontab'命令以重置用户的crontab文件的内容。

我知道如何在Python中执行外部Linux命令。但是当您执行crontab命令(例如crontab -u xxx -e)时,您需要与编辑器交互以修改用户的crontab文件。 (假设我不知道文件的位置。对于新用户,crontab无论如何都会生成一个新文件。而且我不会像root用户那样执行命令。

所以问题是,如何在Python中执行crontab?有没有办法避免与编辑器交互以修改Python中用户的crontab文件?

我的操作系统是ubuntu 14.01。

5 个答案:

答案 0 :(得分:3)

您可以使用python-crontab

安装

sudo -H pip install python-crontab

概念

  • cron 是一个与用户相关的基于时间的作业调度程序。
  • 作业有一个命令和一条评论,并且“附加”到一个cron。
  • 作业由在给定时间附加的cron执行。

代码示例

列出系统cron作业:

from crontab import CronTab
cron = CronTab(tabfile='/etc/crontab', user=False)  # system users cron
# cron  = CronTab(user=True)  # current users cron
# cron  = CronTab(user='username')  # other users cron
for job in cron:
    print(job)

创建一份新工作:

job = cron.new(command='/foo/bar', comment='SomeID')

启用/禁用作业:

job.enable()
job.enable(False)

通过评论查找现有职位:

iter = cron.find_comment('ID or some text')

删除Items ::

cron.remove( job )
cron.remove_all('echo')
cron.remove_all(comment='foo')
cron.remove_all(time='*/2')

清除所有工作的全部cron ::

cron.remove_all()

答案 1 :(得分:1)

正如你在Python中想要的那样,你可以做这样的“事情”:

import os;
...
cur_cron = os.popen('crontab -l > current_crontab.txt');
cur_cron.read();
cur_cron.close();
fopen_cron = file('current_crontab.txt', 'a');
fopen_cron.write("\n### Comment here if you like");
fopen_cron.write("\n* * * * * Put your command here");
fopen_cron.close();

希望它有所帮助。

答案 2 :(得分:1)

使用Vixie crontab,您可以执行以下操作(显然您可以检查错误等):

import subprocess

cron_in = subprocess.Popen(['crontab', '-l'],
    stdout=subprocess.PIPE)
cur_crontab, _ = cron_in.communicate()
# new_crontab = do_my_magic(cur_crontab)
cron_out = subprocess.Popen(['crontab', '-'],
    stdin=subprocess.PIPE)
cron_out.communicate(input=new_crontab)

答案 3 :(得分:0)

您可以/应该首先使用crontab -l转储当前的crontab,按照您想要的方式进行编辑(例如添加一些行或修改),然后安装新的。

这通常适用于crontab <filename>,但也应该使用crontab -,然后将新内容传递到流程的标准中。

答案 4 :(得分:0)

如果你要做的只是重置用户crontab文件的内容,那么只需删除crontab文件(或用默认值覆盖),然后重新加载cron服务。