作成したシェルスクリプトをCronで実行するとパスが通っておらず

Cronジョブでシェルスクリプトを実行すると、コマンドのパスが通っていない

Cronでシェルスクリプトをコマンドのパスをフルパスで記述していない場合は、パスが通っておらずに作ったシェルスクリプトが思っていない動作になる場合があります。Cronジョブは通常、システムの標準的な環境変数(特にPATH変数)をロードしないで実行されるので、コマンドのパスをフルパスで記述していない場合はエラーとなるケースがあります。

対策としては、コマンドをフルパスで記載するのが一般的な対策ですが、他にも対策があるので紹介します

コマンドをフルパス表記する

mysqlをソースからビルドしてインストールした場合は、mysqlコマンドのパスが一般的なパスと異なる場合が多いです。
その際に、mysqlコマンドをフルパスで記載しないとSQLの結果があった場合もmysqlコマンドのパスがないのでエラーとなり変数は空となります。

対策としては、実行するコマンドをフルパスで記載します

#/bin/bash

# フルパスでmysqlコマンド実施
SQL_RESULT1=$(/usr/local/mysql/bin/mysql -u admin-pパスワード -D データベース名 -e "SQL文")

# フルパスで記載しない
SQL_RESULT2=$(/usr/local/mysql/bin/mysql -u admin-pパスワード -D データベース名 -e "SQL文")

# フルパスで記載しない場合は、Cronジョブで実行すると、SQL処理で結果が空でなくても空になります

.bash_profile または .bashrc を読み込む

ユーザーのシェル環境が読み込まれていないためにパスが通らないことが多いので、シェルスクリプトの冒頭で.bash_profileや.bashrcを明示的に読み込むことで対策できます

#!/bin/bash
source ~/.bash_profile
# または
source ~/.bashrc

#以下に動かしたいスクリプトを記載する

PATH変数を設定する

Cronジョブは通常、システムの標準的な環境変数(特にPATH変数)をロードしないので、スクリプトの先頭にPATHを設定することで、この問題を回避できます。

#!/bin/bash
export PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

#以下に動かしたいスクリプトを記載する

bash の-l オプションを利用する

シェルスクリプトの先頭に、#!/bin/bash -l をスクリプトの冒頭に記載すると、ログインシェルとしてBashを起動することになり、ログイン時に読み込まれるプロファイル(例えば、~/.bash_profile や /etc/profile など)も実行されます。

-l オプションの動作

-l(または –login)は、Bashをログインシェルとして起動するオプションです。ログインシェルでは、以下のファイルが読み込まれます。

  1. /etc/profile(システム全体の設定)
  2. ~/.bash_profile、~/.bash_login、または ~/.profile(ユーザーのログイン時の環境設定ファイル)
#!/bin/bash -l

#以下に動かしたいスクリプトを記載する