0

"crontab -l"同じ目的を達成するために、既存のすべての cron ジョブをテキスト ファイルにダンプする Ruby スクリプトが必要です。また、テキスト ファイルを使用し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 ファイルをキャプチャするために実行しようとするcrontab -lことは、タスクを実行するための間接的な方法のように思われ、パスワード要求を処理してコードがハングアップするという手間がかかる可能性があります。プロンプトを台無しにするのではなく、それらを格納するディレクトリをくまなく調べるコードを作成します。を使用してコードを実行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いずれかの OS の決定的な詳細については、コマンドラインで実行してください。


ファイルをバックアップする方法について、少しテストしたコードを次に示します。それらをどのように復元するかはあなた次第ですが、理解するのは難しくありません。

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ます。これらは通常、権限のない詮索好きな目からロックダウンされているためです。

BACKUP_PATHこのコードは、元のファイル パスに基づいて にcrontab のリポジトリを作成します。ファイルの内容は変更されないため、cpこのプロセスを元に戻すコードを使用してコピーするか、コードを記述して、そのまま復元できます。

于 2013-06-27T13:35:38.270 に答える
0

これを行うためにRubyスクリプトを作成する必要がないという@Vorturaに同意します。

本当にしたい場合は、次の方法が考えられます。

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