この記事には広告を含む場合があります。
記事内で紹介する商品を購入することで、当サイトに売り上げの一部が還元されることがあります。
ども。あいしんくいっと(@ithinkitnet)です。
ithinkit
Linuxでスクリプトを定期実行させたい場合、選択肢として真っ先に挙がるのがcronです。Windowsでいうタスクスケジューラ的な使い方が出来て大変便利です。
手軽に使えて便利なcronなのですが、手動実行するとスクリプト実行出来るのにcronだと実行されない!ってのはよくある話です。
そんなときは以下の項目を確認してみてください。
Windowsのタスクスケジューラが動かない場合は下記参照。
Windowsのタスクスケジューラでタスクが動かない!そんなときに確認したい項目6選!
クリック可能な目次
LinuxでCRONでスクリプトが動かない!そんな時に確認したい項目
cronにタスク登録したはずなのに何故かスクリプトが実行されない。そんな時は以下の項目を確認してみてください。
cronの記載方法に間違いないか
cronの記載なんて間違える訳ないだろう!って思ってても意外に間違えるものです。
手動だとスクリプト実行出来るのにcronだとスクリプトが動かない時はもう一度見直してみましょう。
# 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つあります。
- /etc/crontabに設定する方法
- crontabコマンドを使って設定する方法
/etc/crontabはOS全体の設定、crontabコマンドを使った設定はユーザごとの設定になります。
必要によって使い分けると良いでしょう。
crontabを使って設定した場合、/var/spool/cron以下に登録されます。
cronサービスは起動しているか
crondはデフォルトで起動しているので停止していることはないと思いますが、念のために起動確認しておきましょう。
# service crond status
crond (pid 8860) を実行中...
# 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 -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 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の記載方法に間違いがないか
- cronサービスは起動しているか
- 実行権はついているか
- スクリプトパスは間違いないか
- SSH接続が可能か
- expectコマンド入りのスクリプト
どうですか。
ithinkit
以上、あいしんくいっとでした(‘◇’)ゞ