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()
我们知道 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()