cronが起動しないときの確認ポイントまとめ
cronが動かないときの確認ポイントについてまとめました。
日付や時間といった基本的な内容は別エントリーしたいと思います(どこまでが基本かという話もありますが)。
1.原因を調べる
確認ポイントの説明の前に、cronに設定したコマンドやスクリプトが起動しない原因を調べるには、標準エラー出力を確認することが先決です。
もし標準エラー出力に何か残っていれば、そこから対処案を導き出すことができます。
標準エラー出力の設定方法については5項をご覧ください。
2.ファイルを実行する場合は実行権のパーミッションをつける
cronでシェルやPerlなどのファイルを実行する場合、ファイルに実行権のパーミッションの付与を忘れないようにしましょう。
3.ファイルはフルパスで指定する
よくやってしまう失敗ですが、ファイルの指定はフルパスで行います。
/home/foo/public_html/foo.shを実行する場合、cronに設定する内容は次のようになります。
00 * * * * /home/foo/public_html/foo.sh
または、実行ファイルがあるディレクトリまでcdコマンドで移動し、相対パス「./」でそのディレクトリを指定します。
00 * * * * cd /home/foo/public_html; ./foo.sh
cdコマンドで移動した場合、実行ファイルの中に記述したファイルにもディレクトリが反映されるようですが、フルパス指定で実行した場合、実行ファイルの中に記述したファイルはフルパス(またはcdコマンドとペア)で記述する必要があります。
4.シェルで起動する
環境によってはcronからPerlスクリプトなどを直接実行できない場合があります。
そういう場合はcronからshスクリプトを実行し、そのshスクリプトからPerlスクリプトを起動するとよいでしょう。
5.標準出力や標準エラー出力をファイルに書き込む
cronの実行結果は/var/log/cronに保存されるようですが、レンタルサーバによっては閲覧できない場合があります。
そういう場合(でなくても)、cron実行による標準出力や標準エラー出力をファイルに書き込み、そのファイルを参照することでcronが正しく動作しているのか、あるいは動作していないかを判断できます。
書き方の詳細は別エントリーに譲りますが、コマンド実行の後方にリダイレクトで任意のファイル(result.txt)に出力させ、その後方にさらに「2>&1」を記述すれば、標準出力と標準エラー出力をリダイレクト先のファイルに出力してくれます。
/home/foo/public_html/foo.sh > /home/foo/public_html/result.txt 2>&1
または、
cd /home/foo/public_html; ./foo.sh > ./result.txt 2>&1
標準出力と標準エラー出力を異なるファイルに出力するには
/home/foo/public_html/foo.sh 1>/home/foo/public_html/result1.txt 2>/home/foo/public_html/result2.txt
とします。
bashやzshではお作法が若干違うかもしれないのでご注意ください。
6.Windowsでアップロードする際は改行コードに注意する
Windowsで作成したファイルの文字コードはデフォルトでCR+LFですが、Linuxの改行コードはLFなので、そのままサーバにアップロードすると、次のようなエラーになります(エラーの確認方法は4項)。
/bin/sh^M: bad interpreter: No such file or directory
上記のエラーの原因は、次のシェルファイルの1行目の末尾の改行コードがCR+LFになっているためです。
#!/bin/sh
(略)
ということで、Windowsでファイルを作成する際やFFFTPなどで転送する際、正しい改行コードでアップロードされることを確認しましょう(最近のMacはLFみたいです)。
2012.08.08
確認ポイントを追記しました。
- VMをundefineできない場合の対処
- cpanflute2でエラーになる場合の対処
- シェルスクリプトをバイナリ化する「shc」
- OpenSSLで文字列を暗号化・複号化する方法
- sshログインに時間がかかる場合の対処
- vi/vimで範囲指定して置換する方法
- vi/vimでマークした行に移動する方法
- vi/vimで複数行を一括削除する方法
- LinuxでOSキャッシュをクリアする方法
- lessで検索文字列だけを表示する方法
- tailコマンドでファイルがローテートされても追従する方法
- svnでファイルやディレクトリを削除する方法
- phpMyAdminで「unknown system variable 'lc_messages'」となる場合の対処
- Linux(CentOS)でapxsがみつからない場合の対処
- PHP7.3とApacheを連携させる方法