🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
cron

cronは、Unix系OS上でデーモンプロセスとして動作する、スクリプトの自動実行が可能なジョブスケジューラです。

シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

コマンド

コマンドとは特定のタスクを行う為に、コンピュータープログラムへ提示する指示文です。多くの場合、コマンドはShellやcmdようなコマンドラインインターフェイスに対する指示文を指します。

Q&A

解決済

4回答

1326閲覧

以下のようなシェルスクリプトを書いたのですが、crontabすると変数が正常に反映されません

tiqua_nibio

総合スコア62

cron

cronは、Unix系OS上でデーモンプロセスとして動作する、スクリプトの自動実行が可能なジョブスケジューラです。

シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

コマンド

コマンドとは特定のタスクを行う為に、コンピュータープログラムへ提示する指示文です。多くの場合、コマンドはShellやcmdようなコマンドラインインターフェイスに対する指示文を指します。

0グッド

0クリップ

投稿2020/12/09 06:17

以下、crontabにて動作させたいと思っているシェルスクリプトです。

test.sh

1DATESTR=`date +%Y%m%d-%H%M%S` 2 3cd /data/code 4COMMIT_ID=`git log -1 | grep -oE '[0-9a-f]{40}'` 5 6echo ${DATESTR}'_'${COMMIT_ID} >> test.txt

/data/codeの中は、gitのローカルリポジトリとなっており、ここでgitの最終commitのIDを獲得しようというのが、上記4行目のコマンドです。
これは、/data/code以下のディレクトリでないと行えません。

これを、

sh test.sh

で行うと、test.txtの中には

20201126-194504_cd898294d4b321f725f5843ed3f7f0098d13e29f

と日付とcommit IDが残ります。しかしながら、これをcrontabから行うと、

20201209-145701_

となってしまいます。

なぜ、shコマンドで行うのと、crontabで行うのと結果が異なるのか、ご存知の方はいらっしゃいますでしょうか?
よろしくおねがいします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2020/12/09 10:36

crontabにはどのようにJOBを登録しているのでしょうか。crontab -e で登録したときのことです。crontab -l の出力と言ってもよいです。また、ユーザーは同じなのですよね。
tiqua_nibio

2020/12/09 10:46

[root@db734c51390b batch]# crontab -l 0 0 * * * sh /batch/test.sh [root@db734c51390b batch]# ll /batch/test.sh -rw-r--r-- 1 root root 960 12月 9 19:36 /batch/test.sh となっておりますね。
dodox86

2020/12/09 11:42

rootですべて確認しているのでしょうか。
guest

回答4

0

自己解決

私もなるほど、と思ったのですが、whereisを使った方法です。crontabそのものが独自のユーザーのようなものですからね。

bash

1DATESTR=`date +%Y%m%d-%H%M%S` 2 3cd /data/code 4GIT_PATH=(`whereis git`で調べた結果のpathをここに記載する) 5COMMIT_ID=`${GIT_PATH} log -1 | grep -oE '[0-9a-f]{40}'` 6 7echo ${DATESTR}'_'${COMMIT_ID} >> test.txt 8

投稿2020/12/27 15:43

編集2020/12/27 15:50
tiqua_nibio

総合スコア62

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

git関連の環境変数の影響でしょうか。

cronでのエラーメッセージの確認方法が分からないのでしたら、コマンドラインで、

sh

1cd ~ 2env - SHELL=/bin/sh USER=$USER PATH=/usr/bin:/bin PWD=$PWD LANG=$LANG HOME=$HOME LOGNAME=$LOGNAME sh /batch/test.sh

でほぼ同等の環境で実行できます。

投稿2020/12/09 13:11

otn

総合スコア85893

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

COMMIT_ID=`git log -1 | grep -oE '[0-9a-f]{40}'`

というふうにgitコマンドを使うのをやめて、静的な情報にアクセスすることで解決できました。

COMMIT_ID=`cat /data/code/.git/refs/heads/*`

もし、なにかgitを使ってもできるような方法が有りましたら引き続き回答いただけますと幸いです。

投稿2020/12/09 10:24

tiqua_nibio

総合スコア62

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

cron の実行結果が、cron を実行したユーザー宛にメール等で届いていないでしょうか?

実行結果に何かのエラーが記録されていると思いますので、確認して対処する必要があります。

よくある内容としては、cron時とログイン時では環境変数が異なる為、PATH が定義されてなくて、コマンドの実行に失敗した等があると思います。

投稿2020/12/09 06:24

CHERRY

総合スコア25218

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tiqua_nibio

2020/12/09 10:21

ありがとうございます。 エラーは特に出ていないようです。 これはおそらく、git特有の問題なのかもしれません。 下に解決策として、ファイル参照によるコミットIDの獲得を考えることができました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問