cron
tcpdump
,
,Wireshark

Crontabでtcpdumpを設定しようと思ったら、フルパスが必要だった

ネットワークエンジニアがcrontabを設定しようと思ったら、ハマったのでシェア

普段サーバを触っている方なら当たり前だと思いますが
障害対応で、サーバにcronを仕込む必要が出た際にハマったのでまとめます。

最初に作成したスクリプト

作りたかったスクリプトとしては、決まった時間にアプリからよく分からないパケットが出ているようなので
cronでtcpdumpを仕込んで、どんな通信が行われているか裏を取りたいものでした。

作成したシェル

false.sh
#!/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」と分かったので、スクリプトを修正

true.sh
#!/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で何故とユーザのパスが読み込まれないかは、疑問として残っているので
気が向けば調べようとおもいます。