
私は、ほとんどのビルド、インストール、デプロイ、インストール後のプロセスを自動化する複雑な自動化スクリプトを開発しています。問題は、実行する必要があるすべてのコマンドの中に、ユーザーがルートでなければならないコマンドがあることです。 (必要な他のユーザー(user1と呼ばれる)がsudoersリストにないため、これは要件制約です。)
基本的に私がスクリプトを設定した方法は、rootとして実行する必要がある起動スクリプトがあることです。このスクリプトは、他の2つのスクリプトをuser1として呼び出します。
3 つのスクリプトはすべてsharedFunctions.sh
共通機能を定義するスクリプトを共有します。このスクリプトには、run_command
この問題にとって重要ではないコマンドと、失敗した文字列やその他のパラメータを許可する必要がある関数が含まれています。
ここで、指定されたコマンドの出力に失敗文字列が表示されたら、親プロセスを終了して列車全体を停止したいと思います。ルートスクリプトから取得した親PIDに対してエクスポートされた変数がありますが、2つのuser1スクリプトのいずれかを実行したときにスクリプトが失敗した場合、rootが所有するプロセスを終了できません。
資格情報を要求せずにルートに再度「終了」して(ターミナルで実行するのと同様)、ルート所有PIDを削除する方法はありますか?
*****編集する*****
これは私のスクリプトが従う必要がある非常に単純化されたプロセスです。形式は次のとおりです(必須ユーザー:関数)。
user1:maven install
user1:scp jars to chef server
root:chef command
user1:chef command
user1:post-installation scripts
3つのスクリプトと1つのソーススクリプトがあります。
user1cmd1.sh
parentscript.sh
user1cmd2.sh
sharedFunctions.sh
最初のparentscript.sh
スクリプトはそれを使用してPIDを抽出し、export TOP_PID=$$
user1cmd1.shをuser1として呼び出します。そのスクリプトが完了したら、親スクリプトに戻り、Chefコマンドをrootとして実行し、user1cmd2.shをuser1として呼び出します。
私のファイルrun_command
で定義されたスクリプトはsharedFunctions.sh
次のとおりです。
run_command(){
cmd=$1
fail=$2
if $cmd | grep -q $fail;then
kill $TOP_PID #there is more to this particular command, but I don't have it in front of me
fi
}
答え1
parentscript.sh
reaperプロセスを作成してに渡すことができます$TOP_PID
。リッパープロセスは次から開始しようとします。名前付きパイプこれは書き込み可能です user1
。パイプに何も記録されない場合、ハーベスタは読み取りをブロックし、他の操作は実行しません。ただし、パイプに書き込まれた内容があると、収穫機の読み取りが完了し、収穫機は残りのコードを実行し続けて終了します。 -レベルプロセス。