Ruby将所有cron作业转储到文本文件中

时间:2013-06-27 12:05:57

标签: ruby cron crontab

我想要一个ruby脚本,它会使用"crontab -l"或其他任何可以实现相同目标的文件将所有现有的cron作业转储到文本文件中。此外,文本文件应该可以与crontab txtfile一起使用以再次创建cron作业。

以下是我已编写的代码:

def dump_pre_cron_jobs(file_path)
        begin
            cron_list = %x[crontab -l]
            if(cron_list.size > 0)
                cron_list.each do |crl|
                    mymethod_that_writes_tofile(file_path, crl) unless crl.chomp.include?("myfilter")
                end
            end
        rescue Exception => e
            raise(e.message)
        end
    end

3 个答案:

答案 0 :(得分:1)

为什么这需要是一个Ruby脚本?

正如您所说,您可以将crontab转储到包含crontab -l > crontab.txt的文件。

要再次阅读它们,只需使用crontab crontab.txtcat crontab.txt | crontab -

即可

答案 1 :(得分:0)

我同意@Vortura您不需要创建Ruby脚本来执行此操作。

如果你真的想,这可能是:

File.open('crontab.txt', 'w') do |crontab|
  crontab << `crontab -l`
end

答案 2 :(得分:0)

注意:以root用户身份运行,或使用sudo应该捕获系统上的所有cron作业,而不仅仅是单个用户的作业。以您自己或该用户身份运行它,它可能只捕获那些作业。我没有测试它的那个方面。


尝试运行crontab -l来捕获所有用户和包的crontab文件似乎是执行任务的间接方式,并且可能有处理挂起代码的密码请求的麻烦。我会编写代码来梳理存储它们的目录,而不是弄乱提示。使用sudo运行代码,访问文件时不会有任何问题。

http://www.linuxquestions.org/questions/linux-newbie-8/etc-crontab-vs-etc-cron-d-vs-var-spool-cron-crontabs-853881/上查看讨论,了解有关实际cron选项卡文件存储在磁盘上的位置的信息。

https://superuser.com/questions/389116/how-to-recover-crontab-jobs-from-filesystem/389137也有类似的信息。

Mac OS与cron文件所在的Linux有所不同。在命令行运行man cron以获取有关任一操作系统的确切详细信息。


这是一个经过精心测试的代码,用于说明我如何备份文件。如何恢复它们是为了让你弄明白,但不难发现:

require 'fileutils'

BACKUP_PATH = '/path/to/some/safe/storage/directory'

CRONTAB_DIRS = %w[
  /usr/lib/cron/tabs
  /var/spool/cron
  /etc/anacrontab
  /etc/cron.d
]

CRONTAB_FILES = %w[
  /etc/cron_list
]

def dump_pre_cron_jobs(file_path)

  full_backup_path = File.join(
    BACKUP_PATH,
    File.dirname(file_path)
  )
  FileUtils.mkdir_p(full_backup_path) unless Dir.exist?(full_backup_path)

  File.write(
    File.join(
      full_backup_path,
      file_path
    ),
    File.read(file_path)
  )
rescue Exception => e
  STDERR.puts e.message
end

CRONTAB_DIRS.each do |ct|
  next unless Dir.exist?(ct)
  begin
    Dir.entries(File.join(ct, '*')).each { |fn| dump_pre_cron_jobs(fn) }
  rescue Errno::EACCES => e
    STDERR.puts e.message
  end
end

CRONTAB_FILES.each do |fn|
  dump_pre_cron_jobs(fn)
end

你需要通过sudo以root身份运行它来访问目录和文件,因为它们通常被锁定在未经授权的窥探之下。

代码根据原始文件路径在BACKUP_PATH中创建一个crontabs存储库。没有对文件内容进行任何更改,因此可以通过cp复制它们或编写代码来反转此过程来原样恢复它们。