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

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

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

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

cron

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

Q&A

解決済

2回答

916閲覧

shellに実装したループ文における手動実行とcron実行における挙動の差異について

GamerIris

総合スコア4

bash

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

cron

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

0グッド

0クリップ

投稿2023/04/09 11:43

実現したいこと

shellに実装したループ文の結果が手動実行とcron実行で差異があるため、
手動実行内容に合わせたい。

質問内容

あるファイル数分繰り返し処理を行いたいのですが、cron側にて意図しない挙動となってしまっております。
色々調べてみたのですが原因が特定出来なかった為、皆様へお聞きしたい次第となります。

該当のソースコード

#!/bin/bash
~省略~
USER_NAME=`whoami`
CURRENT_DIRECTORY=/home/"$USER_NAME"
~省略~
INPUT_DIR="$CURRENT_DIRECTORY"/ディレクトリ
INPUT_FILE1=rotation_list.lst
INPUT_FILE_PATH1="$INPUT_DIR"/"$INPUT_FILE1"
~省略~
#入力ファイルの読込
while read line; do
TARGET_DIR="$line"
sudo ls "$TARGET_DIR" >> /ディレクトリ/command.log
sudo ls "$TARGET_DIR" | while read FILE; do
echo "呼ばれたよ" >> /ディレクトリ/command.log
~省略~
done
done < "$INPUT_FILE_PATH1"

該当のcron設定内容

#パス設定
PATH=/bin/bash:/usr/local/sbin:/usr/bin:/bin:/usr/local/bin
#JOB_NET設定
00 20 * * 0 /bin/bash /ディレクトリ/rotation.sh

試したこと

標準出力内容をそれぞれログ出力し、内容の確認を実施。
【手動実行】
20230326_145007_rotation.log
20230402_145007_rotation.log
20230409_201022_rotation.log
呼ばれたよ
呼ばれたよ
呼ばれたよ

【cron】
20230326_145007_rotation.log
20230402_145007_rotation.log
20230409_200803_rotation.log
呼ばれたよ

補足情報(FW/ツールのバージョンなど)

PRETTY_NAME="Ubuntu 22.04.2 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04.2 LTS (Jammy Jellyfish)"
VERSION_CODENAME=jammy
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=jammy

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

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

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

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

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

otn

2023/04/09 12:43

>> /ディレクトリ/command.log という記述が2箇所ありますが、 >> ディレクトリ/command.log の間違いですかね?
otn

2023/04/09 12:45

> 標準出力内容をそれぞれログ出力し、内容の確認を実施。 というのは、command.log の中身を見たのだと思いますが、タイムスタンプを確認して今書かれた物であることは確認していますか?あるいは、毎回の実行前に削除していますか?
otn

2023/04/09 12:49

cronから起動されたスクリプトの実行途中で command.log を見たのじゃなくて、 ちゃんとスクリプトが終了していることをps等で確認した上で確認していますよね?
GamerIris

2023/04/09 13:06

otnさん ご返信ありがとうございます。 ・1点目 /から始まる内容にて実装となります。  ※諸事情にて”ディレクトリ”文言等、一部内容をマスキングしております。 ・2点目 ご指摘通りです。 cron、手動実行共に走行時のタイムスタンプであったことは確認済となります。 また、走行前に既存ログは削除(rm)してはおります。 ・3点目 ご指摘通りです。 htopでの処理の状態監視、掲示させて頂いたソースコードでは登場しませんが、 終了時にdiscord及びLineの通知を持って正常終了していることはcron、手動実行共に確認済となります。
otn

2023/04/09 13:47

> /から始まる内容にて実装となります。 なるほど。 > INPUT_DIR="$CURRENT_DIRECTORY"/ディレクトリ にも「ディレクトリ」という表記が出ていますが、これらは別物で、 INPUT_DIR="$CURRENT_DIRECTORY"/ディレクトリ1 ・・・ >> /ディレクトリ2/command.log みたいなことですかね。 マスクするのは良いのですが、同じ物なのか別物なのか区別しましょう。 > ・2点目 > ・3点目 ということであれば、書かれている範囲では問題なさそうなので、書いてない部分に何らかの原因があるのかも知れません。 特に根拠は無いのですが、 スクリプト中の 「>> /ディレクトリ/command.log」を全部取り除いて、crontabのコマンドラインで、 00 20 * * 0 /bin/bash /ディレクトリ/rotation.sh > /ディレクトリ/command.log とまるごとログに書くとどうでしょうか?
GamerIris

2023/04/09 14:39 編集

otnさん ご回答ありがとうございます。 一番最後のアドバイス内容を試してみましたが、 「手動実行」側のコンソールに表示された内容と同一の出力内容でした。 (コンソールにタイムスタンプを表示させているのでそこは差異が当然発生はしておりますが・・・) また、上記でお気づきかもしれませんが ある別スクリプトにて出力されたログのローテーションをしたいのが最終目標(週での2世代保持あたり)の為、 最悪解決しそうにない場合は「/etc/logrotate.d」配下に 新たな今回用のルールを追加する考えとしては持っております。
otn

2023/04/09 16:02

> 一番最後のアドバイス内容を試してみましたが、 >「手動実行」側のコンソールに表示された内容と同一の出力内容でした。 であれば、やっぱり、書いてない部分に何らかの原因があるということですね。 > ある別スクリプトにて出力されたログのローテーションをしたいのが最終目標(週での2世代保持あたり)の為、最悪解決しそうにない場合は「/etc/logrotate.d」配下に新たな今回用のルールを追加する考えとしては持っております。 ログのローテートなら、普通は、/etc/logrotate.d の下に書くので、普通のやり方をするのが良いと思います。
otn

2023/04/10 04:02

異常に関係あるかどうか不明ですが、 USER_NAME=`whoami` CURRENT_DIRECTORY=/home/"$USER_NAME" INPUT_DIR="$CURRENT_DIRECTORY"/ディレクトリ という記述が非常に奇異です。「カレントディレクトリー」の理解が正しくない気がします。
guest

回答2

0

自己解決

「「/etc/logrotate.d」配下に新たな今回用のルールを追加する」方針へ倒してみようと思います。
otnさん、take88さん、他皆様ありがとうございました。

投稿2023/04/09 22:51

GamerIris

総合スコア4

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

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

0

出力結果を見ると異なるファイルが読み込まれるように見えますね。

当てずっぽうですが、手動で実行したユーザーと、Cronで実行された時のユーザーが一致しているかが、気になりますね。

もしも、cron が root で実行されているなら「/home/root/」というディレクトリを参照していることになりますが、通常、root のホームディレクトリは「/root/」ですので、その辺に間違いがないか確認すると何かわかるかもしれません。

投稿2023/04/09 18:02

take88

総合スコア1379

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問