実行中のスクリプトは自分でバックグラウンドに移動できますか?
私は目的があります: 私はスクリプトを実行します: ./script.sh
。スクリプトでパスワードを要求します。
echo -n PASSWORD:
read -s pass
if [ "${scriptPassword}" == "$pass" ] && [[ ${pass_counter} = 0 ]]; then
pass_counter = $ ((pass_counter + 1))
echo "PASSWORD OK"
Ctrl次に+を押してからコマンドを実行するのとZ
同じ効果を得たいと思いますbg
。スクリプトからこれらのコマンドを実行できますか?
スクリプトが で始まったかのように機能したいのです
nohup ./script.sh &
が、ユーザーが正しいパスワードを入力した後にのみ可能です。
ベストアンサー1
1. 直接法
これは次のように似ています。ホクラキンの答えしかし、もっと簡単です。スクリプトがインタラクティブな操作を完了したら、次の手順を実行します。
(kill -STOP $$; kill -CONT $$) &
sleep 1
ここで、スクリプトは+Ctrlに非常に似ている非常に小さい(非同期)サブシェルを作成してそれを停止(スクリプトプロセス)してから、次のようにZします。続く実際の信号と非常によく似た直感的な信号bg
。その必要さえないかもしれませんsleep
。シグナルが入ってくると、スクリプトが重要なタスクを実行しない方が安全であると思います。
私はこれをテストしましたが、表面的にのみテストしたので、実際のアプリケーションコンテキストで使用すると驚くことがあります。
____________
*違いはCtrl+ ZSIGTSTP 転送です。スクリプトで SIGSTOP の代わりに SIGTSTP を使用できます。 SIGSTOPでテストしましたが、うまくいけば変更する理由はありません。
2. おそらくもっと簡単でしょう(おそらくより移植性が高いでしょうか?)
スクリプトに自分自身を非同期的に呼び出すようにします。
if [ "$exported_pass" != "$scriptPassword" ] それから [読むには、ここに適切なコードを挿入してください。渡すユーザーとループで] [適切になるまで(または試しすぎてやめます)。 ] # だからこの時は "$scriptPassword" == "$pass" エクスポートしたパス = "$passes" エクスポートエクスポート_パス いいえ "$0" "$@" & 出口 フィリピン諸島
スクリプトが最初に実行されたときに$exported_pass
設定されていないため、入力してif
パスワードthen
を求めます。その後、それをexported_pass
環境変数に入れて自分自身を非同期で呼び出します。その後、基本(親)プロセスが終了します。スクリプトへの2回目の呼び出しはバックグラウンドで実行され、環境でパスワードを確認した後に操作を続行します。