注意:以 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
或编写代码来反转此过程来将它们恢复原样。