質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

解決済

3回答

16779閲覧

Shellスクリプトをcronを通して実行した場合、シェル内のecho "$変数" >> ファイル への追記が失敗する

minhouse10

総合スコア41

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

0グッド

0クリップ

投稿2018/01/11 02:26

編集2018/01/11 02:50

プロンプトからShellを直に実行した場合、以下変数の値をEchoコマンドによってファイルへリダイレクトは問題なくされますが、以下のようにCronを通して実行された場合、該当シェル内のechoコマンドの変数の値がリダイレクトされずファイルにも追記されません。cronやリダイレクト処理の仕組みの理解不足かと思いますが、アドバイス頂戴できますと幸いです。

失敗:
下記のcronタスクを通して実行された場合にシェルの該当処理 echoコマンドの実行がreport.logにリダイレクトされない

echo "$変数" 1>> report.log

成功:
シェルをプロンプトから直接叩いた場合は、上記echoコマンドの結果はreport.logに書き込まれる。

cronのタスク:
スクリプト全体の標準出力は問題なくリダイレクトされる

5 * * * * /bin/bash /Backup/cal_v2.sh > $LOG_DIR/logs_date +\%Y\%m\%d\%H\%M.log

report.log ファイルの権限 755:

-rwxr-xr-x. 1 root root report.log


特定の情報はマスクしましたが、以下は実行環境の情報になります。現在の所rootが実行ユーザでスクリプトとログファイルの出力先は全て同じディレクトリにおいております。

[root@system Backup]# ls -ld
drwxr-xr-x. 2 root root 4096 Jan 11 10:13 .

[root@system Backup]# pwd
/Backup

[root@system Backup]# id
uid=0(root) gid=0(root) groups=0(root) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

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

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

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

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

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

guest

回答3

0

5 * * * * /bin/bash /Backup/cal_v2.sh > $LOG_DIR/logs_date+\%Y\%m\%d\%H\%M.log

crontabファイルのこの行より前で、環境変数LOGDIRを設定していないので、これが空になり、
/logs_~.logつまり、ルートディレクトリ直下に書こうとして失敗しています。

cron

1LOG_DIR=/Backup 25 * * * * /bin/bash /Backup/cal_v2.sh > $LOG_DIR/logs_`date+\%Y\%m\%d\%H\%M`.log

のようにこの行以前で環境変数を定義すれば良いかと。

投稿2018/01/11 14:40

otn

総合スコア84538

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

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

minhouse10

2018/01/11 15:31

otn様、今回もご教授頂きましてありがとうございます。 crontabの説明を省略してしまったのですがLOG_DIRの定義は存在しておりまして、スクリプト処理全体に対する標準出力は$LOG_DIR/logs_`date+\%Y\%m\%d\%H\%M`.logに問題なく出力されております。今回シェルの中である変数だけを別ファイルへ追記するリダイレクトが上手くいっておりませんでしたので、該当ファイルの定義をフルパスで指定した所問題が解決致しました。
otn

2018/01/11 15:55

失礼しました。 > スクリプト全体の標準出力は問題なくリダイレクトされる を見落としていました。 フルパスで書くファイルが多くなるようなら、スクリプト先頭でcdしてしまうのもいいかと思います。 特定ディレクトリのファイルを多く扱うスクリプトだとそうすることが多いです。
minhouse10

2018/01/11 16:13

otn様、いえいえとんでもございません、アドバイスありがとうございます。 こちらも大事な情報を省略してしまいました。確かにおっしゃる通り最初にcdするのも考慮するべきでした。今後新しいスクリプトを書くさいには意識したいと思います。改めてありがとうございました。
guest

0

そのスクリプトで期待する動作が成功するための条件が成立しているかどうかを印字しログでその結果を確認すると原因を調べるヒントが得られると思います。例えば以下など・・・

bash

1... 2id #どのユーザーで実行されているか 3pwd #作業ディレクトリーはどこ? 4ls -ld . #作業ディレクトリーのアクセス権限は?(新規にファイルを作れるか?) 5...

もう少しきちんと調べるにはやはりman cronなどによりcronの仕様を確認するのがよいと思います。

投稿2018/01/11 02:45

KSwordOfHaste

総合スコア18394

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

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

minhouse10

2018/01/11 02:51

KSwordOfHaste様、アドバイス頂きありがとうございます!。早速実行環境について追記させて頂きました。man cronの情報も確認してみます。
KSwordOfHaste

2018/01/11 02:55

いえ、cronで実行する対象のスクリプト上に上記を書いて、結果がどうなるかをcronのログ(例えばrootへメールされる内容)を確認するということを意図したコメントです。 ログインシェル上で確認することではありません。
minhouse10

2018/01/11 02:58

KSwordOfHaste様、あっ、なるほど、失礼いたしました。早速シェルの中に含めてみます。また結果ご報告させて頂きます。
minhouse10

2018/01/11 04:37

KSwordOfHaste様、cronでスクリプトが実行された際の作業ディレクトリが/rootになっています。これが関係しているのかもしれませんね。 uid=0(root) gid=0(root) groups=0(root) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 /root dr-xr-x---. 9 root root 4096 Jan 10 22:55 .
KSwordOfHaste

2018/01/11 05:10

そのようです。 /root直下には自分自身(root)でもファイルを生成するのを禁止するようになっていますね。少なくともそういう環境ではcronで実行するスクリプトで作業ディレクトリーに依存する処理をするならスクリプト上で明示的にcdしておくか、またはスクリプト上に相対パスを指定しないような配慮が必要ということと思います。
minhouse10

2018/01/11 06:20

KSwordOfHaste様、スクリプト内の該当箇所をプルパスで指定した所、アドバイスにより問題が解決しました!echo "$変数" 1>> /Backup/report.log、改めましてご教授頂き、誠にありがとうございました!
guest

0

自己解決

KSwordOfHaste様のご教授により、

スクリプト内に以下のデバッグ用のコマンドを追記:

...
id #どのユーザーで実行されているか
pwd #作業ディレクトリーはどこ?
ls -ld . #作業ディレクトリーのアクセス権限は?(新規にファイルを作れるか?)
...
実行結果:
uid=0(root) gid=0(root) groups=0(root) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
/root
dr-xr-x---. 9 root root 4096 Jan 10 22:55 .

ログは/Backupにあるにも関わらず、Cronから呼び出す場合の作業ディレクトリは/rootになっていました。これによりスクリプトのフォルダ内で実行時はうまくいく理由が分かりました。スクリプト内の該当箇所をプルパスで指定した所、アドバイスにより問題が解決しました!echo "$変数" 1>> /Backup/report.log、KSwordOfHaste様改めましてご教授頂き、誠にありがとうございました!

投稿2018/01/11 06:23

minhouse10

総合スコア41

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問