このようなシェルスクリプトがあります
#!/bin/bash
while true;do
#Code HERE!
#Pushing Data to DB
echo "Data to DB"> /root/schip.log 2>&1
done
スクリプトは継続的に実行され、サーバーから情報を収集し、データをデータベース(タイムスタンプデータベース)に送信します。なぜそうなのかわかりません。時にはスクリプトが死ぬこともあります。ログには何も表示されません。同様に、Pythonスクリプトでもこれを見ることができます。 Pythonスクリプトは次のとおりです。
import <stuff>
while True:
#Code HERE
#Push data to DB
print "Data to DB"
それでは、原因は何ですか?それを防ぐ方法?そして、その理由を理解するために、どのようにロギング(PythonとShellで)を有効にできますか?ありがとうございます!
答え1
シェルが終了する可能性があるいくつかの点(完全ではありません):
- ユーティリティを呼び出します
exit
。当然の事実を忘れないでください - ユーティリティを呼び出します
return
。この場合、bash
関数またはソースファイル内でのみ返されます。 exec cmd
。これは同じプロセスで実行されるため、cmd
実際にループが中断されます。cmd
スクリプトは終了時に終了します。set -e
/が有効になり(環境変数set -o errexit
を参照)、コマンドはエラーで終了します。SHELLOPTS
bash
set -u
/set -o nounset
が有効で設定されていない変数を参照します。- a
DEBUG
またはERR
トラップは call として定義されますexit
。 - 失敗する特別な組み込み機能。特殊な組み込み関数(たとえば
set
、、、:
...eval
)が失敗すると、シェルは終了します。ただし、この場合、bash
これはPOSIXモードでのみ発生します(たとえば、sh
環境でPOSIXLY_CORRECTが呼び出された場合...)、すべての特殊な組み込み関数に対しては発生しません。たとえば、: > /
シェルが終了します。 - 〜のように@schilyが言及、構文エラー(条件のみを満たすコードと同様)。
$((1/x))
0(または)で割ります${array[1/x]}
。bash
たとえば、特定の制限に達すると内部エラーが発生します。- メモリ割り当て失敗
- プロセスを分岐できません。
- スタックサイズを超えました(たとえば、関数再帰を使用している場合)。
- その他限界合格
ulimit
(これにより一部の信号が送信される可能性があります)
- 他のプロセスによって終了しました。他のプロセスは、
kill()
スクリプトを明示的に終了するインタプリタを呼び出すことができます。 - システムによって殺された。
- 信号/信号終了。
^C
/を押すと^\
。 - ため息をつく。端末の接続が切断された場合。
- SIGSEGV/SIGBUS/SIGILL。 bashコマンド実行エラー(エラー)またはハードウェア(メモリ)エラー。
- SIGPIPE:組み込み(
echo
、、printf
)は閉じたパイプまたはソケットに書き込みます(stderrがパイプの場合はエラーメッセージが表示される可能性があります)。
- 信号/信号終了。
最初に確認する必要があるのは、エラーメッセージと終了ステータスです。
答え2
スクリプトの構文エラーにより、スクリプトが終了します。
スクリプトコードに特定の状況でスペースを含めることができるシェル変数が含まれている場合、シェル変数を二重引用符で囲まないと構文エラーが発生する可能性があります。
答え3
おそらく、シェルは外部コードを取得するために「.」を使用しています。注文する。
このコードは同じシェルインスタンスによって解釈されます。コードに構文エラーがある場合、またはコードが「終了」を実行すると、呼び出しスクリプトは停止します。すべてのループでスクリプトが呼び出されない可能性があるため、ジョブが失敗する前にしばらく実行されます。
3回のループ後に失敗する構文エラーがある例
#!/bin/sh
i=3
while true
do
let i=i-1
[ $i -eq 0 ] && . ./a 2>/dev/null
sleep 2
done
「a」スクリプトに「fi」がありません。
if true
then
echo a