ネットワークエンジニアがcrontabを設定しようと思ったら、ハマったのでシェア
普段サーバを触っている方なら当たり前だと思いますが
障害対応で、サーバにcronを仕込む必要が出た際にハマったのでまとめます。
最初に作成したスクリプト
作りたかったスクリプトとしては、決まった時間にアプリからよく分からないパケットが出ているようなので
cronでtcpdumpを仕込んで、どんな通信が行われているか裏を取りたいものでした。
作成したシェル
# !/bin/bash
tcpdump -i eth0 -n -W 1 -G 3 -w /home/ec2-user/tcpdump/log/td-`date +%Y%m%d-%H%M%S`.pcap
cronの記載
45 04 * * * /home/ec2-user/tcpdump/false.sh
cronにシェルを実行登録し、シェルはtcpdumpを数秒動かすだけの簡単な作りです。
ただ、実際に動作させると分かりますが、このCronとシェルの書き方では、tcpdumpは動作しません。
手でシェルを叩くとログ取得できるのに、cronだと出来ない。何故か?しばらく悩みました。
ll /home/ec2-user/tcpdump/log/
total 0
cronの時間が来てもログが出力されない。。。
Cronはパスの見え方が違う
crontabにはフルパスで。
http://d.hatena.ne.jp/k_k_yuta/20100128/1264694207
crontabの環境変数PATHについて調べてみた
http://dqn.sakusakutto.jp/2014/04/crontab_path.html
これらのサイトが役に立ちました。
crontabはユーザのパスが通っておらず、フルパスでの記載が推奨とのこと。
早速フルパスに修正
tcpdumpのフルパスを調査
which tcpdump
/usr/sbin/tcpdump
私の環境でtcpdumpのフルパスが「/usr/sbin/tcpdump」と分かったので、スクリプトを修正
# !/bin/bash
/usr/sbin/tcpdump -i eth0 -n -W 1 -G 3 -w /home/ec2-user/tcpdump/log/td-`date +%Y%m%d-%H%M%S`.pcap
cronの記載(時間だけ変更)
08 05 * * * /home/ec2-user/tcpdump/true.sh
時間が来てログを確認してみると。。。
ll /home/ec2-user/tcpdump/log/
total 4
-rw-r--r-- 1 root root 986 May 3 05:08 td-20180503-050801.pcap
無事にログが出力されました!!!
crontabで何故とユーザのパスが読み込まれないかは、疑問として残っているので
気が向けば調べようとおもいます。