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

Python: How to handle 'crontab' command?

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

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

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

所以问题是,我怎样才能在Python中执行crontab?有什么方法可以避免与编辑器交互以修改 Python 中用户的 crontab 文件?

我的 OS 是 ubuntu 14.01.

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

这通常适用于 crontab <filename>,但也适用于 crontab -,然后将新内容通过管道传输到进程的标准输入中。

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

正如您在 Python 中所希望的那样,您可以 "something" 这样做:

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();

希望对您有所帮助。

使用 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)

你可以使用 python-crontab.

安装

sudo -H pip install python-crontab

概念

  • A cron 是一个与用户相关的基于时间的作业调度程序。
  • A job 有一个命令和一个注释并且是 "attached" 一个 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')

删除项目::

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

清除所有作业的整个 cron::

cron.remove_all()