From the Southern Hemisphere

From the Southern Hemisphere

南半球に移住したプログラマの日々

【Linux】Crontabに設定したシェルが実行できない現象の対応

こんにちは、ピコピコくんです。
今回はCentOSのCrontabに設定したシェルが実行されなかった現象に対応したときのことを書きました。 

現象

他のCentOSサーバー上で動いていたシェルをWindowsマシンにコピーして、そこから別のCentOSサーバーに移動。コピー先のCentOSのCrontabに登録して、実行結果を確認してみると...。おやおや? ファイルが出力されるはずなのに、ファイルが無い?

検証

Crontabの登録内容に誤りがないか確認したけれど、問題は無さそう。他のサーバーで稼働している実績があるから問題無いとは思うけれど念のためコマンドラインからシェルを実行してみると...あれれ、エラーになった!?

$ ./hoge.sh
-bash: ./hoge.sh: /bin/bash^M: bad interpreter: そのようなファイルやディレクトリはありません

えぇ、ファイルは存在しているのにどういうこと!?

 

エラーの原因

ファイルは存在しているのにどうしてこんなエラーが発生するのか?

困ったときにはGoogle先生に聞け!ということで下記の記事が見つかりました。

totech.hateblo.jp

どうやらシェルをWindows環境で保存した際にLinuxの改行コード \n が \r\n に変更されてしまったのが原因のようです。catで確認してみると確かに記事にあるように各行の末尾に ^M$ が表示されていました。

解決法

文字列を置換する sed コマンドでシェル内の \r\n を \n に置換します。

$ sed -i 's/\r//' hoge.sh

置換実行後にコマンドラインからシェルを実行してみたら無事に実行できました!更にCrontabに登録して実行結果を確認したところ、こちらも問題無く動作していました。

あぁ良かった、本当に良かった!
WindowsでLinuxに移すファイルを扱うときは注意が必要ですね。

sedコマンドの使い方は下記を参照してください。

www.atmarkit.co.jp

 

読者さん募集中

記事が気に入ったら読者登録をお願いします!