お久しぶりです
cron、使ってますか?
俺は初めて使いました(noob)
cronでperlスクリプトを実行できない躓きを踏んだので、備忘します
cronって?
Linuxに標準で備わっているプログラムの一種で、設定すると処理を自動で定期的に実行することができます。
crond(デーモン)と、crontab(設定ファイル)からなる、自動実行してくれるちゃん
crondは、1分に一度実行され、crontabに設定された内容を実行してくれます。
たとえばcrontabに
*/1 * * * * echo "hello" >> /home/cron_test.txt
と記述すると、毎分/home/cron_test.txt
にhello
と書き込まれます。
行頭の*/1 * * * *
が実行間隔を示しています。
続く、 echo "hello" >> /home/cron_test.txt
が実行するコマンドになっています。
やろうとしたこと
perlで、定期実行したいスクリプト(script.pl
)を作りました。
ウキウキでcrontab -e
して
*/1 * * * * perl /path/to/script.pl
と記述しました。
これで、毎分script.plが実行されるはず!!!!!
実行されませんでした。GGWP;;
なぜできなかったか?
結論から言うと、
シェルスクリプトで呼び出されるperlコマンドと、cron上で呼び出されるperlコマンドが違ったから。
でした
試したこと:script.plがコマンドライン上で動くか?
動いた。
script.plは間違ってないらしい
試したこと:cronがactiveになっているか?
参考:cronのstatus確認 cronの起動・停止・再起動・状態確認, cronの実行ログ - Ubuntuサーバー構築入門 - Ubuntuサーバーでゼロから環境構築
これがinactiveになってないか?を見ました。
ウチの環境ではactiveでした。
試したこと:cron再起動
sudo systemctl restart cron
で再起動できます
参考:cronの再起動 cronの起動・停止・再起動・状態確認, cronの実行ログ - Ubuntuサーバー構築入門 - Ubuntuサーバーでゼロから環境構築
残念ながら再起動しても動かず
試したこと:perl以外の自動実行をcrontabに記述してみる
crontabに、
*/1 * * * * echo "hello" >> /home/cron_test.txt
と記述してみる
結果、
- perl script.plは動かない
- echo "hello"は動く
な状態に
仮説:perl特有の現象なのでは?
調べてみるとこんな情報が
なるほどね
解決策
crontabに、
*/1 * * * * /path/to/perl /path/to/script.pl
と記述する
perl script.pl
じゃなくて、
path/to/perl script.pl
として、
perl実体を指定してあげるのがキモ
/path/to/perl を調べる
perl -V | grep perl
で、シェルスクリプトでperlした時呼び出されてる、perl実体のpathを調べる
調べた情報を参考に、
/なんちゃらかんちゃら/perl-5.38.2/bin/perl
みたいな文字列を作る。
シェルスクリプト上で、
perl -v
/なんちゃらかんちゃら/perl-5.38.2/bin/perl -v
を実行して、同じ内容が返ればOK
crontabを編集して再起動
crontab -e
でcrontabを編集する
*/1 * * * * /なんちゃらかんちゃら/perl-5.38.2/bin/perl /path/to/script.pl
と記述する。
この時、それぞれのパスは必ず絶対パスで記述する
のち、
sudo systemctl restart cron
で再起動
でうまくいきます。多分