我本该输入“crontab -e”,却不小心输入了“crontab”,结果卡在了一个进程的中间,于是我中止了该进程。现在当我输入 crontab -e 时,它完全是空白的。这可不是什么好事。如果我不能找回它,我就需要重写它。
有什么办法可以:
- 找回我的 crontab 任务?它们在内存中吗?Linux 中帐户特定的 crontab 文件位于哪里?或者
- 获取 cron 执行的所有操作的日志,以便我可以对我的 crontab 文件进行逆向工程。我已经很久没有看过它了?
答案1
crontab
不带参数从标准输入读取 crontab 文件。例如,您可以使用:
echo "* * * * * run-this-every-minute" | crontab
一旦您破坏了您的 crontab(即crontab -l
不显示任何内容),就没有好的方法可以将其恢复。
在我的系统 (Ubuntu 11.04) 中,个人 crontab 存储在/var/spool/cron/crontabs/<USER>
-- 但这就是您破坏的地方,因此这对您没有任何好处。(您的系统上的路径可能不同。)
/var/log/syslog
我看到了由执行的命令的条目cron
;您可能能够从中重建您的 crontab(或者您的系统的等效项,如果有),但这会很乏味。
以下是我为避免此类问题所采取的方法:
我将 crontab 保存在一个单独的文件中,并在源代码控制系统中维护。我安装它仅有的通过运行
crontab filename
我从来不用crontab -e
。如果我不小心破坏了我的 crontab,我可以从文件中重新加载它。(嗯,几乎从不使用;我有时会用它crontab -e
来做临时更改,因为我知道以后可以恢复当前版本。)
答案2
完整 crontab 恢复脚本
我制作了一个 PHP 脚本,根据日志对 crontab 进行完整恢复。
它输出用户在过去一周内运行的每个 cron 命令的单个实例。
我把它放在这里
https://github.com/dangreenisrael/recover_crontab
以下是示例输出:
perl ~/sorttv/sorttv.pl
/usr/local/bin/flexget
bash ~/scripts/sort_sports.sh
~/scripts/play_recently_added.sh
答案3
抱歉,但我忍不住要问一个显而易见的问题:为什么不从备份中恢复它?
呃,抱歉,我看这个已经有人建议过了。
答案4
@Keith Thompson 的回答很棒 - 从 /var/log/syslog 重建是个好主意!
我还意外破坏了我的用户 crontab,但能够使用以下脚本重建它
mkdir ~/syslog
sudo cp /var/log/syslog* ~/syslog/
sudo chmod 777 ~/syslog/*
cat ~/syslog/* | grep "(username)" | grep -o "CMD.*" | sort | uniq
其中,用户名应该替换为您要重建其 crontab 的用户。
请注意,如果日志已被压缩,您可能需要先对 /var/log/syslog.x.gz 文件的内容进行 gunzip 压缩(ubuntu 会压缩 syslog.2+)
这也将仅获取仍在日志中的命令,这些命令大约是过去 7 天的命令...因此,如果您有一个未运行的月度任务...该任务可能已经消失了