astech

柱に印をつける身長記録の、デジタル版

cronでperlが実行できなかった話

お久しぶりです

cron、使ってますか?

俺は初めて使いました(noob

cronでperlスクリプトを実行できない躓きを踏んだので、備忘します

cronって?

Linuxに標準で備わっているプログラムの一種で、設定すると処理を自動で定期的に実行することができます。

https://www.miraiserver.ne.jp/column/about_cron/#:~:text=cron%E3%81%A8%E3%81%AF%E3%80%81Linux%E3%81%AB,%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B%E3%81%A8%E4%BE%BF%E5%88%A9%E3%81%A7%E3%81%99%E3%80%82

crond(デーモン)と、crontab(設定ファイル)からなる、自動実行してくれるちゃん

crondは、1分に一度実行され、crontabに設定された内容を実行してくれます。

たとえばcrontabに

*/1 * * * * echo "hello" >> /home/cron_test.txt

と記述すると、毎分/home/cron_test.txthelloと書き込まれます。

行頭の*/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特有の現象なのでは?

調べてみるとこんな情報が

note103.hateblo.jp

 

 

 

なるほどね

解決策

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

で再起動

  

  

  

でうまくいきます。多分