困っていること
とあるサーバーのcrontab
コマンドを叩いたら、めっちゃ長いcron設定が出てきた。
よく見たら、コメントアウトされているエントリーが多くて、半分くらいゴミだった。
捨てるのが苦手なので、累々とゴミが積みあがっている状態でした。
なんとかしなければ。
コマンド例
やった順にコマンドを書く
1.まるっと出す
crontab -l
crontabの設定がまるっと出力される。垂れ流しです。
長いのでcrontab -l | more
などしないと滝のように流れます。
2.コメント行を除去
crontab -l | grep "^[^#]"
cronの設定内容のうち、#で始まらないものが表示される。
cronとして有効なものだけが出てくる。
正規表現の^[^#]
は
^
行頭記号=各行の先頭が
[^#]
#ではない任意の1文字
という意味です。
cronで今有効なものだけをサクッと見たい場合は、ここまでで大丈夫です。
3. 意味のあるコメントを復活
crontab -l | grep "^[^#]" -B1
2のコマンドだと人間用のコメントも消えてしまうので、grepに-B1
を付けることで、
- 先頭が#でないもの
- さらにその1行前(BeforeのB)
- grepが出す区切り文字の--
となる。
有効なエントリーとその行の1つ前も出てくる。コメントとエントリーがセットになっているパターンの時有効である。
cronのエントリーの直前にコメントが書いてる前提のコマンドです。コメントが2行以上あるときは、、ごめん。
4. 不要な--を除去
crontab -l | grep "^[^#]" -B1 | sed -e "s/^--$//g"
grep
の-B
オプションを付けると不要な区切り文字「--」が入るので、sed
で抜き取る。以下の3行のパターンに整形されるはず
# コメント
0 * * * * /home/kanaxx/test.sh
(空行)
5. ファイルに保存
crontab -l | grep "^[^#]" -B1 | sed -e "s/^--$//g" > /tmp/crontab.cleaned
ただファイルにリダイレクトしただけ。
コマンドの結果がファイルに保存されます。
確認
現状のものとの差分確認
crontab -l | diff - /tmp/crontab.cleaned
crontabコマンドで今設定されている実態を取り出し、上で作ったファイルとのdiffをとる。
diff の第一引数は-
ハイフン1個。これは標準入力を比較対象とすることになるので、crontab -l
の出力内容と比較対象としている。以下のようにファイルに書きだしてdiffするのと同じ。
crontab -l > /tmp/crontab.now
diff /tmp/crontab.now /tmp/crontab.cleaned
crontab.newがいつのものか分からないのと、crontabが別の誰かによってすでに変更されていることもあるので、crontabコマンドから直結するほうがいい(と思う)
ぶちこむ
crontab < /tmp/crontab.cleaned
覚悟を決めてエイっと。あとは祈る
さいごに
最後の部分でcrontabコマンドに突っ込み直すところはやらずとも、コメントだらけで可読性の低いcrontabから大事なものを探すのが簡単にできるようになります。
捨てるのが苦手な人は何でもコメントアウトで残しちゃいますからね。crontabの古いエントリーをコメントアウトした状態で消せない人におすすめです。