- PR -

SHELLスクリプトが【実行されたり・されなかったり】はなぜ?

1
投稿者投稿内容
なんぺい
常連さん
会議室デビュー日: 2003/09/26
投稿数: 26
投稿日時: 2005-09-12 20:23
いつも参考にさせて頂いています。
どなたかご教授ください。

【環境】
 Linux Version : Turbo Linux 7.0

DBバックアップのSHELLスクリプトを、cronにて毎日定時に起動するように
設定しているのですが、実行される日/実行されない日のように不定期に
バックアップが行われない事象が発生しています。
実行方法等は以下のようにしております。

・crontabの設定
01 * * * * root run-parts /etc/cron.hourly <- 毎時起動する時間補正用
30 0 * * * root run-parts /etc/cron.backup <- バックアップ用

・1次SHELL
 /etc/cron.backup 下に以下の内容の「BACKUP_1ST.sh」を配置

#!/bin/bash
USER=local_user
LOG=/tmp/backup_1st.log
echo "`date` BACKUP_1ST.sh Start" > $LOG
echo "`date`: BACKUP start" >> $LOG
(su - $USER -c "bin/backup.sh") 1>> $LOG 2>&1
echo "`date`: BACKUP completed" >> $LOG

・2次SHELL (上記で実行される bin/backup.sh)
~/local_user/bin/backup.sh に配置
※oracleのホットバック記述等が記載されている

・実行時のログでは
1次SHELLのログ結果では、実行前と実行後のログが出力されているので
起動が行われていることは確認できる

・/var/log/messages では
NGの時:セッションクローズまでわずか1秒
Sep 6 00:30:00 XXX PAM_pwdb[29923]: (su) session opened for user local_user by (uid=0)
Sep 6 00:30:01 XXX PAM_pwdb[29923]: (su) session closed for user local_user

OKの時:セッションクローズまでそれなりの時間
Sep 8 00:30:00 XXX PAM_pwdb[13271]: (su) session opened for user local_user by (uid=0)
Sep 8 01:25:42 XXX PAM_pwdb[13271]: (su) session closed for user local_user

以上の情報で何か分かりますでしょうか?
よろしくお願いします。

[ メッセージ編集済み 編集者: なんぺい 編集日時 2005-09-12 20:24 ]
jk
ベテラン
会議室デビュー日: 2005/08/19
投稿数: 94
投稿日時: 2005-09-12 20:47
こんにちは

Oracleはほとんど使ったことないのですが、一言。

bin/backup.sh には if等の分岐は書かれていないのでしょうか?
また、ホットバックするときにエラーを吐いてないですか?
/dev/nullとかに放り込んでないですか?
REDOログとか、何チャラセグメントとかなんかの領域が不足していたりするんじゃないですか?

スレ汚しスマソ
なんぺい
常連さん
会議室デビュー日: 2003/09/26
投稿数: 26
投稿日時: 2005-09-13 09:49
jk さん 返答ありがとうございます。

2次SHELL (上記で実行される bin/backup.sh) のTOPでもログ収集するようになって
いるのですが、このログ吐き出しも実行されず(このログ収集ステップを外しても同
じ)状態で、oracleのバックアップが始まる以前の話なのです。
ちなみに、oracleのalertログ等にもエラーは発生していませんでした。

引用:

bin/backup.sh には if等の分岐は書かれていないのでしょうか?



1つ教えて下さい。
if文の分岐があると支障がある場合があるのでしょうか?
ちなみに、「if文の分岐」使用しています。


[ メッセージ編集済み 編集者: なんぺい 編集日時 2005-09-13 09:53 ]
angel
ぬし
会議室デビュー日: 2005/03/17
投稿数: 711
投稿日時: 2005-09-13 10:01
おはようございます。

最終的にはスクリプトの中身の問題になりそうではあるのですが…。

スクリプトをそのまま実行せずに、bash の -x オプションを併用すれば、実行内容の詳細 ( スクリプト内の一つ一つのコマンドの内容 ) が吐き出されます。これで証拠を集めては如何でしょうか。
※ 〜/bin/backup.sh の代わりに bash -x 〜/bin/backup.sh
※ もしくは、“#!/bin/bash”の代わりに“#!/bin/bash -x”

後は、ログにタイムスタンプがあった方が分かりやすいですから、そのような仕組みも併用するとなお良さそうです。
rcスクリプトで使用される initlog ( 簡単な syslogへの転送 ) や、djb の daemontools 付属の multilog が候補ですが、ちょっとしたものなら、自分で作れそうです。

例えば、

 コマンド | perl -pne '$_=scalar(localtime).q( ).$_'

とか、日時のフォーマットを凝るなら

 コマンド | perl -pnM'POSIX qw(strftime)' -e '$_=strftime(q(%H:%M:%S ),localtime).$_'

とか。
以上、ご参考まで。
冬寂
ぬし
会議室デビュー日: 2002/09/17
投稿数: 449
投稿日時: 2005-09-13 10:08
横槍すいません。
引用:

1つ教えて下さい。
if文の分岐があると支障がある場合があるのでしょうか?
ちなみに、「if文の分岐」使用しています。


これって、失礼かもしれませんがif文の意味を知っていて質問しているんですよね?
(すいません。最近、信じられないような質問をよく見かけるもので。。。)

「if文で、条件をテストしてみて条件に合致したらバックアップをする」というだけの話なのではないですか?
angel
ぬし
会議室デビュー日: 2005/03/17
投稿数: 711
投稿日時: 2005-09-13 10:23
補足です。
ログのリダイレクト処理ですが、一つ一つ書くのは面倒なので、まとめるのも良いと思います。

before:
 コマンド1 >>ログファイル 2>&1
 コマンド2 >>ログファイル 2>&1
 …

after:
 exec >>ログファイル 2>&1
 コマンド1
 コマンド2
 …

応用すれば、先ほど紹介した、タイムスタンプをつけるスクリプトも併用できます。
( bash のコマンド置換 )

before:
 コマンド1 2>&1 | perl 〜 >>ログファイル
 コマンド2 2>&1 | perl 〜 >>ログファイル
 …

after:
 exec > >(perl 〜 >>ログファイル 2>&1) 2>&1
 コマンド1
 コマンド2
 …

※訂正
スクリプト版の after で、>() の中身がログファイル上書きのリダイレクトになっていたため、追記に変更しました。

[ メッセージ編集済み 編集者: angel 編集日時 2005-09-13 13:24 ]
jk
ベテラン
会議室デビュー日: 2005/08/19
投稿数: 94
投稿日時: 2005-09-13 12:41
なんぺい様

if文の分岐に関してですが 冬寂様のおっしゃるとおり、バックアップを実行しない条件があるのでは?ということです。ifに限らず caseや
[expr] || バックアップコマンド
などでも同様です。

angel様の提案どおりログを出来る限り取得して現象の発生しているポイントを特定するのが、面倒でも何よりも確実で結果的に早いと思います。
修正前のオリジナルのB/Uを取ることを忘れずに......

関係ない話だと思いますが。
私も以前にHP-UXで、同様にcron起動でSHELLを間にかませてバッチ処理をしていたのですが、不可解なことに何故かSHELLが2重に起動してしまいdead lockしてしまうことがありました。
片方のSHELLをKILLすることで、SHELLは流れましたが不定期に現象が発生するため原因がつかめませんでした。しばらくは運用で逃げていましたが、後にcron起動でない別のシステムで起動するようになりました(システム名失念)。

cron->SHELL1->SHELL2->自作のバッチ(PLSQL)
※SHELL1が何故か2ついた。
なんぺい
常連さん
会議室デビュー日: 2003/09/26
投稿数: 26
投稿日時: 2005-09-13 13:21
みなさんからのレス、貴重な情報ありがとうございました

よく見ると最初の自分の投稿で情報が足りなかったため、話がif文に行って
しまったようです。(すいません)

後付ですが補記します。
2次SHELL(bin/backup.sh)は1次SHELLから起動されているようだが、2次
SHELLが吐き出すログさえも存在していない状況なのです。
2次SHELL内では起動直後にログが必ず採取されるようにしているため、if文
云々以前の問題と定義してご教授を願いたかったのです。
いずれにしても、angelさんの情報などを参考にもう少し情報収集してみます。
1

スキルアップ/キャリアアップ(JOB@IT)