フォークされたプロセスが完了したら、コマンドラインにコントロールをリリースします。

フォークされたプロセスが完了したら、コマンドラインにコントロールをリリースします。

私は初めてLinuxシェルスクリプトに触れ、次のスクリプトを書いています。

スクリプトは正常に実行されますが、プログラムが完了してプログラムが完了したというメッセージが表示された後にコマンドラインプロンプトを表示するには、キーボードで手動で[ENTER]を押す必要があります。私のスクリプトはなぜこのように動作しますか?

サブプロセスが完了し、スクリプトエコープログラムが完了したときに制御がコマンドラインに戻り、コマンドラインプロンプトを表示するために何もする必要がないようにするにはどうすればよいですか。

#!/bin/ksh    
echo "program running..."

funcall(){    
  nohup <<command_name>> $program >/dev/null 2>&1      
  pid = $!      
  wait pid      
  echo "program completed..."      
  exit 
}

fork(){
  funcall &
}
fork

ベストアンサー1

分岐したプロセスがそれ自体を待つのは非常にまれです。

制御フローは次のようにする必要があります。

  1. フォークプロセス
  2. 子プロセスはそのタスクを実行します。
  3. 両親はやるべきことをして待つ

これは次のように翻訳されます。

#!/bin/ksh

echo "program running..."

funcall () {    
  nohup some_command "$program" >/dev/null 2>&1      
  echo "program completed..."      
}

fork () {
  funcall &
}

fork
child_pid="$!"
wait "$child_pid"

この場合、関数の実行中は何もしないため、呼び出しの背景とfuncall関数呼び出しが返されるのを待つことは完全に不要ですforkfuncall

コードが行うのは、バックグラウンドでサブシェルを実行し、すぐに親シェルに制御を返すことです。スクリプトの出力により、プロンプトが少し混乱することがあります。

スクリプトにはいくつかのエラーもあります。

  1. pid変数として使用されますが、必要です$pid
  2. 割り当てられたターゲットpidの周りにスペースを入れないでください=

またexit必要ありません。

あなたの要件を満たす簡単なスクリプトは次のとおりです。

#!/bin/ksh

echo "program running..."
nohup some_command "$program" >/dev/null 2>&1      
echo "program completed..."      

おすすめ記事