あいしんくいっとオススメ商品レビュー

LinuxのCRONでスクリプトが動かない時に確認したい項目

この記事には広告を含む場合があります。

記事内で紹介する商品を購入することで、当サイトに売り上げの一部が還元されることがあります。

本記事対象
Linuxのcronでスクリプトが動かなくてお困りの方

ども。あいしんくいっと(@ithinkitnet)です。

ithinkit

cronで設定したシェルが起動しない・・・。

Linuxでスクリプトを定期実行させたい場合、選択肢として真っ先に挙がるのがcronです。Windowsでいうタスクスケジューラ的な使い方が出来て大変便利です。
手軽に使えて便利なcronなのですが、手動実行するとスクリプト実行出来るのにcronだと実行されない!ってのはよくある話です。
そんなときは以下の項目を確認してみてください。

Windowsのタスクスケジューラが動かない場合は下記参照。
Windowsのタスクスケジューラでタスクが動かない!そんなときに確認したい項目6選!

LinuxでCRONでスクリプトが動かない!そんな時に確認したい項目

cronにタスク登録したはずなのに何故かスクリプトが実行されない。そんな時は以下の項目を確認してみてください。

cronの記載方法に間違いないか

cronの記載なんて間違える訳ないだろう!って思ってても意外に間違えるものです。
手動だとスクリプト実行出来るのにcronだとスクリプトが動かない時はもう一度見直してみましょう。

crontab

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name command to be executed

左から「分、時、日、月、週」の順。

cronを設定する方法は大きく2つあります。

cron設定方法
  1. /etc/crontabに設定する方法
  2. crontabコマンドを使って設定する方法

/etc/crontabはOS全体の設定、crontabコマンドを使った設定はユーザごとの設定になります。
必要によって使い分けると良いでしょう。

MEMO

crontabを使って設定した場合、/var/spool/cron以下に登録されます。

cronサービスは起動しているか

crondはデフォルトで起動しているので停止していることはないと思いますが、念のために起動確認しておきましょう。

Cent6系コマンド

# service crond status
crond (pid  8860) を実行中...
Cent7/8系)コマンド

# systemctl status crond
● crond.service - Command Scheduler
   Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
   Active: active (running) since 土 2017-02-11 23:48:18 JST; 2 months 3 days ago

もし、cronが起動していなければ自動起動するように設定しておきましょう。

スクリプトに実行権は付与されているか

cronで実行対象となるシェルスクリプトに実行権限が付与されているか確認しましょう。

lsコマンド

# ls -l test.sh
-rwxr-xr-x 1 root root 92  4月 17 11:06 2017 test.sh

シェルスクリプトに実行権限(x)がない場合は「chmod +x」するなりして権限を付与しましょう。

シェルスクリプトのパス指定に間違いないか

実行させたいシェルスクリプトのパス間違いもやりがちなパターン。
CRONで実行したいスクリプトパスが間違えていることもたまにあります。
ホントに間違いないか、lsコマンドで再度見直しましょう。

シェルスクリプトパス間違い


# ls /script/hoge.sh
ls: /script/hoge.sh にアクセスできません: そのようなファイルやディレクトリはありません

cronログ見ても普通に実行されているかのようにログ出力されてしまうのが何とも・・・。

Apr 08 13:02:01 logsrv CROND[25294]: (root) CMD (/scrip/test.sh > /dev/null 2>&1)

気を付けましょう。

SSH接続が可能か

個人的によくやるのが、スクリプト内でSSH接続を行っている場合、SSH接続の初回ログイン確認で止まっているケース。
テスト環境と本番環境でそれぞれ別のサーバで検証するため、テスト環境では良くても本番では駄目といったことになりかねない。。。

ssh接続

# ssh admin@192.168.11.100
The authenticity of host '192.168.11.100 (192.168.11.100)' can't be established.
RSA key fingerprint is 0a:55:ef:0c:92:9c:ba:47:19:31:ac:fe:b4:77:da:db.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.11.100' (RSA) to the list of known hosts.

事前にSSH接続出来ることぐらいは確認はしておきましょう・・・。

expectコマンド入りのスクリプト

ちょっとマニアックな感じですが、参考まで。

expectコマンドを使ったスクリプトをCRONで動かそうとすると動かなかった。
ターミナルで手動実行すると問題なく動作する。

原因は「interact」だった。
以下のようにスクリプトを修正することで無事に動くようになりました。

修正前

interact
"


修正後

send ¥"exit¥n¥"
expect ¥"~];¥"
expect eof
exit
"

では、最後にまとめ。

cronでスクリプトが動かない時に確認したい項目
  1. cronの記載方法に間違いがないか
  2. cronサービスは起動しているか
  3. 実行権はついているか

  4. スクリプトパスは間違いないか

  5. SSH接続が可能か

  6. expectコマンド入りのスクリプト

どうですか。

ithinkit

cronが動かない時の参考にしてください。

以上、あいしんくいっとでした(‘◇’)ゞ

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)