【问题标题】:Python: How to handle 'crontab' command?Python:如何处理“crontab”命令?
【发布时间】:2015-07-30 20:11:05
【问题描述】:

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

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

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

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

我的操作系统是 ubuntu 14.01。

【问题讨论】:

标签: python linux ubuntu cron crontab


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      如你所愿,你可以在 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();
      

      希望对您有所帮助。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          你可以使用python-crontab

          安装

          sudo -H pip install python-crontab
          

          概念

          • cron 是与用户相关的基于时间的作业调度程序。
          • job 有一个命令和一个注释,并且“附加”到一个 cron。
          • job 由它在给定时间附加到的 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()
          

          【讨论】:

          • 如何列出所有现有的 crons(不使用正则表达式或名称)?
          猜你喜欢
          • 1970-01-01
          • 2017-01-27
          • 2010-10-08
          • 2020-10-11
          • 1970-01-01
          • 2021-10-11
          • 2018-07-26
          • 1970-01-01
          • 2018-11-19
          相关资源
          最近更新 更多