web-dev-qa-db-ja.com

crontabが削除されましたか?

「crontab -e」と入力する代わりに、誤って「crontab」と入力してプロセスの途中で動かなくなったため、プロセスを中止しました。 crontab -eに移動すると、完全に空白になります。これは全然良くありません。取り戻せない場合は、書き直す必要があります。

次の方法はありますか?

  1. crontabジョブを元に戻しますか?彼らはどこかに記憶にありますか? Linuxのアカウント固有のcrontabファイルはどこにありますか?または
  2. cronが実行したすべてのログを取得して、crontabファイルをリバースエンジニアリングできるようにします。久しぶりに見ていましたか?
11
user12832

引数なしのcrontabは、標準入力からcrontabファイルを読み取ります。たとえば、次を使用できます。

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

Crontabを壊した後(つまり、crontab -lは何も表示しません)、それを元に戻す良い方法はありません。

私のシステム(Ubuntu 11.04)では、個人のcrontabは/var/spool/cron/crontabs/<USER>に格納されていますが、それはあなたが壊したものなので、何の役にも立ちません。 (パスはシステムによって異なる場合があります。)

cronによって実行されたコマンドのエントリが/var/log/syslogに表示されます。それ(またはシステムの同等のもの)からcrontabを再構築できる場合もありますが、面倒になります。

この種の問題を回避するために私が行うことは次のとおりです。

私はcrontabを別のファイルに保存し、ソース管理システムで管理しています。私はそれをインストールしますonlyを実行することによって

crontab filename

crontab -eは使用しません。誤ってcrontabを壊してしまった場合は、ファイルから再読み込みするだけです。 (まあ、ほとんどありません。後で現在のバージョンを復元できることを知って、一時的な変更を行うためにcrontab -eを使用することがあります。)

14
Keith Thompson

Crontabを完全に回復するためのスクリプト

ログに基づいてcrontabを完全に回復するPHPスクリプトを作成しました。

先週ユーザーが実行したすべての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
5

申し訳ありませんが、明白な質問をせずにはいられません。バックアップから復元してみませんか?

えー、すみません、それはすでに提案されているようです。

1
Lee-Man

EDITOR環境変数がEDITOR = viの場合は、試してください

vi -r

セッションを回復します。保存したセッションを取得した場合は、crontabディレクトリに直接書き込まないでください。これをガイドとして使用して、crontabを再作成します。

crontab -e

注:OSを指定しなかったため、Solarisおよびその他のUNIX OSは、crontab-eで作成されたものを除いてcrontabファイルへの変更を認識しません。私の記憶が正しければ、Linuxはそうです。

0
jim mcnamara

@KeithThompsonからのすばらしい回答-/ var/log/syslogから再構築することをお勧めします!

また、誤ってユーザーのcrontabを壊してしまいましたが、次のscript-fuで再構築できました。

mkdir ~/syslog
Sudo cp /var/log/syslog* ~/syslog/
Sudo chmod 777 ~/syslog/*
cat ~/syslog/* | grep "(username)" | grep -o "CMD.*" | sort | uniq

ここで、usernameは、再構築するcrontabを持つユーザーに置き換えます。

ログが圧縮されている場合は、最初に/var/log/syslog.x.gzファイルの内容をgunzipで圧縮する必要がある場合があることに注意してください(ubuntuはsyslog.2 +を圧縮します)。

これはまた、ログに残っているコマンドだけを取得します。これは、過去7日間程度です...したがって、実行されなかった月次タスクがある場合...そのタスクはおそらくなくなっています

0
Jamie Cook