我不小心输入了“ crontab”,而没有键入“ crontab -e”,并且卡在了进程的中间,所以我中止了该进程。现在,当我转到crontab -e时,它完全空白。这根本不好。如果我找不回来,我将需要重写它。
有什么办法可以:
- 恢复我的crontab作业?他们在某个地方的记忆中吗?Linux中特定于帐户的crontab文件在哪里?要么
- 获取cron完成的所有操作的日志,因此我可以对crontab文件进行反向工程。我好久没看了?
我不小心输入了“ crontab”,而没有键入“ crontab -e”,并且卡在了进程的中间,所以我中止了该进程。现在,当我转到crontab -e时,它完全空白。这根本不好。如果我找不回来,我将需要重写它。
有什么办法可以:
Answers:
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
做临时更改,因为我知道以后可以恢复当前版本。)
crontab -l > filename
。要恢复它,crontab filename
。使用系统提供的界面;不要落后,不要操纵系统文件。一方面,更新文件并不一定告诉系统重新读取它;而是更新文件。该crontab
命令将。另外,文件中的内容与crontab -l
; 的输出之间可能会有差异。在Ubuntu上,该文件还有一些额外的注释行,建议您不要对其进行编辑。
/var/spool/cron/crontabs/<USER>
。在SUSE,我的路径略有不同(注额外的斜杠)/var/spool/cron/cron/tabs/<USER>
。以为我会为像我这样的cron和linux的新手提到它。基思的答案是正确的。
我制作了一个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
@Keith Thompson的好答案-从/ var / log / syslog重构的好主意!
我也无意中破坏了我的用户crontab,但是能够使用以下脚本fu重新构建它
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天...因此,如果您有一个每月任务没有运行,则该命令可能已经消失了