<解決済み>直接叩くと実行できるシェルスクリプトをcronで実行するとエラーになる件2017-11-17<解決済み>直接叩くと実行できるシェルスクリプトをcronで実行するとエラーになる件CentOS7.3今回はCentOSで遭遇した事象についての原因と調査内容の共有です。11/17時点でまだ解決していません。今後も調査を続け続報をアップする予定ですが、お気付きのことがありましたらアドバイス頂けると助かります。11/19解決しました!!何が起きている?シェルにログインして直接起動すると問題なく動くシェルスクリプトがあるのですが、これを定期実行しようとcronに登録したところ、エラーが出て動かないという事象に遭遇しました。/usr/local/bin/hoge.shパーミッションが755ですので誰でも実行可能なはずです。(LoadError)(以下、省略)iconvが見つからないようです。iconv/usr/bin/iconv/usr/binの下にあります。※cronの実行ユーザで確認しています。$PATH/user-name/.rbenv/shims:/user-name/.rbenv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/user-name/bin/usr/binにもパスが通っています。cron実行時のPATHの確認cronに1分ごとにPATHを書き出すコマンドを設定して待機します。/tmp/path.txt'1分後、cronが動いてファイルが作成されたので中身を確認します。/user-name/.rbenv/shims:/user-name/.rbenv/bin:/usr/local/sbin:/usr/sbin:/usr/bin:/bin:/user-name/bin並べてみましょう。上が対話型ログイン状態でのPATH、下がcron時のPATHです。/user-name/.rbenv/shims:/user-name/.rbenv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/user-name/bin/user-name/.rbenv/shims:/user-name/.rbenv/bin:/usr/local/sbin:/usr/sbin:/usr/bin:/bin:/user-name/bin違いが2点ありました。1つ目は、対話型の時には「/usr/local/bin」にパスが通っていますが、cron時には通っていません。2つ目は、対話型の時には「/bin」にパスが通っていませんが、cron時には通っています。今回はcronで動かないことが問題なので1つ目の方が怪しいです。1.でも書いたように、今回起動したいスクリプトは「/usr/local/bin」の下にあります。started.」はhoge.shの中で出力するように記述しているものですので、hoge.shは確実に起動しています。すると、hoge.shから呼んでいる処理の中で何らか「/usr/local/bin」の下のプログラムをパスなしで使おうとしているものがあるのかも知れません。一縷の望みを託してhoge.shの頭に次の1行を追加してみます。(LoadError)ダメでした。rubyを疑う今回動かしたいスクリプトはシェルからrubyのプログラムを読んでおり、そのプログラムの中でiconvを見つけられないようなのですが、rubyにちょっと事情があったことに気が付きました。対象サーバにはrbenvが入っており、2.4.1がデフォルトになっているのですが、今回呼び出しているスクリプトは、1.8.7じゃないと動かない仕様のため、シェルからスクリプトを呼び出すときにバージョンを指定して実行しています。実際には以下の呼び出し方をしていました。/path-to-program/program.rbネット上で色々調べてみると、以下のように1.8.7のrubyプログラムを直接起動するやり方があるようなので、これを試してみることにします。finished.改めて考えると、バージョンを指定してrubyを起動するのに環境変数を書き換えるのはちょっと乱暴すぎる気がします。なんで今までこのやり方を良しと思ったのかは自分でも謎ですが、修正後のように、プログラムに引く数を渡して実行する方が常識的な感じがしますね(後だしならなんとでも言える)。あとがきプログラムが動いたことで課題は解決したのですが、その後調べていた中で1点疑問が残りました。今回のエラーは、rubyのバージョンの指定方法が拙かった以前に、cronの中でrbenvを認識できていないことが根底にあるようでした。コマンドが見つかりませんとなり、そもそものrbenvにパスが取っていないことが分かりました。rbenvがある「/user-name/.rbenv/bin」にはcron時にもパスが通っていることは確認できているので、まだ何か問題が残っているようですが、当初の課題は解決したのでこれ以上の調査はペンディングにします。月別アーカイブスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。