Crontab删除了吗?


11

我不小心输入了“ crontab”,而没有键入“ crontab -e”,并且卡在了进程的中间,所以我中止了该进程。现在,当我转到crontab -e时,它完全空白。这根本不好。如果我找不回来,我将需要重写它。

有什么办法可以:

  1. 恢复我的crontab作业?他们在某个地方的记忆中吗?Linux中特定于帐户的crontab文件在哪里?要么
  2. 获取cron完成的所有操作的日志,因此我可以对crontab文件进行反向工程。我好久没看了?

3
只需从最近的系统备份中还原它即可。
David Heffernan

如果像我一样键入crontab -r并找到此线程,则可以恢复从/ var / log中读取日志的命令。就我而言,syslog.1满足了我的所有需求
StackUnder

Answers:


14

crontab不带参数的情况会从标准输入中读取crontab文件。例如,您可以使用:

 echo "* * * * *  run-this-every-minute" | crontab

一旦破坏了crontab(即不crontab -l显示任何内容),就没有办法将其恢复。

在我的系统(Ubuntu 11.04)上,个人crontab被存储在/var/spool/cron/crontabs/<USER>-但这就是您破坏的内容,因此对您没有任何好处。(系统上的路径可能不同。)

我看到了/var/log/syslogcron; 执行的命令的条目;您也许可以从中(或系统的等效物,如果有的话)重构crontab,但这将是乏味的。

为避免此类问题,我将采取以下措施:

我将crontab保存在一个单独的文件中,该文件保存在源代码控制系统中。我只能通过运行来安装

crontab filename

我从不使用crontab -e。如果不小心破坏了crontab,我可以从文件中重新加载它。(好吧,几乎没有;我有时会crontab -e做临时更改,因为我知道以后可以恢复当前版本。)


@mountainclimber:我不同意。要保存您的crontab,请使用crontab -l > filename。要恢复它,crontab filename。使用系统提供的界面;不要落后,不要操纵系统文件。一方面,更新文件并不一定告诉系统重新读取它;而是更新文件。该crontab命令将。另外,文件中的内容与crontab -l; 的输出之间可能会有差异。在Ubuntu上,该文件还有一些额外的注释行,建议您不要对其进行编辑。
基思·汤普森

我将删除其他评论。新评论:Keith提到path /var/spool/cron/crontabs/<USER>。在SUSE,我的路径略有不同(注额外的斜杠)/var/spool/cron/cron/tabs/<USER>。以为我会为像我这样的cron和linux的新手提到它。基思的答案是正确的。
mountainclimber

5

完整的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

1

很抱歉,但是我不禁要问一个明显的问题:为什么不从备份中还原它?

嗯,对不起,我已经建议了。


0

如果您的EDITOR环境变量为EDITOR = vi,请尝试

vi -r

恢复会话。如果有会话,请不要直接将其保存到crontab目录中。使用它作为指南来使用重新创建crontab

crontab -e

注意:由于未指定操作系统,因此Solaris和其他UNIX操作系统无法识别对crontab文件的更改,但通过crontab -e创建的更改除外。如果我没记错的话,Linux可以。


没有会话可以恢复;OP键入crontab而不是crontab -e。请参阅我的答案,以获得更好的(IMHO)方式来维护您的crontab。
基思·汤普森

0

@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天...因此,如果您有一个每月任务没有运行,则该命令可能已经消失了

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.