crontab 删除了吗?

crontab 删除了吗?

我本该输入“crontab -e”,却不小心输入了“crontab”,结果卡在了一个进程的中间,于是我中止了该进程。现在当我输入 crontab -e 时,它​​完全是空白的。这可不是什么好事。如果我不能找回它,我就需要重写它。

有什么办法可以:

  1. 找回我的 crontab 任务?它们在内存中吗?Linux 中帐户特定的 crontab 文件位于哪里?或者
  2. 获取 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 天的命令...因此,如果您有一个未运行的月度任务...该任务可能已经消失了

相关内容