0

我想要一个 ruby​​ 脚本,它将所有现有的 cron 作业转储到一个文本文件中,"crontab -l"或者使用任何其他可以实现相同目标的东西。此外,文本文件应该可以用来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
4

3 回答 3

1

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

正如您所说,您可以将 crontab 转储到带有crontab -l > crontab.txt.

要再次读回它们,只需使用crontab crontab.txt, 或cat crontab.txt | crontab -

于 2013-06-27T12:18:39.870 回答
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 与 Apple 放置 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

您需要以 root 身份运行它sudo才能访问目录和文件,因为它们通常被锁定以防止未经授权的窥探。

BACKUP_PATH该代码基于其原始文件路径在 中创建一个 crontab 存储库。不会对文件内容进行任何更改,因此可以通过将它们复制回来cp或编写代码来反转此过程来将它们恢复原样。

于 2013-06-27T13:35:38.270 回答
0

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

如果你真的想,这里有一个可能的方法:

File.open('crontab.txt', 'w') do |crontab|
  crontab << `crontab -l`
end
于 2013-06-27T12:27:20.207 回答