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

Ruby将所有cron作业转储到文本文件,ruby,cron,crontab,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)

我想要一个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

为什么这需要一个Ruby脚本

正如您所说,您可以使用
crontab-l>crontab.txt
将crontab转储到一个文件中


要重新读取它们,只需使用
crontab crontab.txt
,或
cat crontab.txt | crontab-

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

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

File.open('crontab.txt','w')do | crontab|

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


尝试运行
crontab-l
为所有用户和软件包捕获crontab文件似乎是完成此任务的间接方法,可能会遇到处理密码请求的麻烦,从而挂起代码。我会编写代码来梳理存储它们的目录,而不是弄乱提示。使用
sudo
运行代码,您应该不会在访问文件时遇到任何问题

请参阅:上的讨论,以获取有关实际cron选项卡文件存储在磁盘上的位置的信息

也有类似的信息

Mac OS与Linux稍有不同,苹果在Linux中放置了cron文件。在命令行上运行
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
运行此程序,以访问目录和文件,因为它们通常被未经授权的窥探者锁定


代码根据crontab的原始文件路径在
BACKUP\u PATH
中创建crontab的存储库。不会对文件内容进行任何更改,因此可以通过
cp
将文件内容复制回原样,或者编写代码来反转此过程。

因为ruby应用程序的这一部分正在创建新的cron作业,但需要先捕获现有作业,否则这些作业将丢失。您是否编写了这样的脚本,或者至少启动了它,遇到了问题?还是你只是想放弃这个想法,希望有人能为你写?这是一个工作任务还是一个你个人想要解决的问题?我已经写了一篇文章,但是因为我对ruby相当陌生,所以我想得到专家的贡献。这里是:
def dump_pre_cron_作业(文件路径)begin cron_list=%x[crontab-l]if(cron_list.size>0)cron_list.each do | crl | mymethod| u写入_文件(文件路径,crl)end-end-end-rescue异常=>e-raise(e.message)end
谢谢,但把它放在评论里并没有多大好处,因为它会让人看不懂。通过编辑将其附加到问题中。如果缩进代码,四个空格的堆栈溢出将自动将其格式化为代码。这是假设您希望为所有用户获取cron作业?如果只是当前登录用户的cron作业呢?我的脚本可以吗?嗯,你说的是“所有现有的cron作业”,不是“单个用户的现有cron作业”,但是,以你自己的身份运行它,因为权限的工作方式,它可能只捕获你。很抱歉,这是我对登录用户的一个错误,因为应用程序将由特定用户部署。将测试您的脚本并让您知道。谢谢。嗨@铁皮人,刚刚测试了你的代码,但是得到了错误:
未定义的方法
exist?'for Dir:Class`at position
next,除非Dir.exist?(ct)
。这是正确的。如果您的Ruby版本很古老,请尝试
Dir.exists?
。您也可以使用
File.exists?
File.exists?
。它们同时测试文件和目录。Ruby 1.9+有
Dir.exist?