私はこれを自分で解決しようとして膨大な量の検索と実験を行ってきましたが、答えが不足しています。
バックグラウンド:
Tcl バージョン 8.4 と Expect パッケージ拡張バージョン 5.45 を使用してスクリプトを作成しています。私は期待を学んでおり、「バックグラウンド処理」の章(第17章、Exploring Expect)で起こりました。374 ~ 375 ページでは、「fork」コマンドについて説明しています。結局のところ、これはまさに私が達成しようとしていた機能を提供しました。スクリプトの最初の部分を実行する必要があります。ここでは、ユーザー入力が必要な場合と必要でない場合があります。その時点から、スクリプトが別のツールを起動し続け、それ自体が終了する前に終了するのを待っている間に、ターミナルが制御をシェルに返すようにします (スクリプト プロセスがバックグラウンドで実行されたかのように)。それが完了すると、スクリプト プロセスは正常に終了します。
問題:
私のexpectのforkコマンドの使用法では、一見すべてが機能しているように見えます。親プロセスと子プロセスを取得します。親プロセスは指示どおりに終了し、端末はシェル制御に戻ります。子プロセスは、本来あるべきツールを起動し続けました。問題は、そのツールが終了すると、子プロセスも終了するはずですが、そうではありませんでした。プロセスは「S」またはスリープ状態のままでした。参考までに、私はもともと子に対して「切断」を期待するコマンドを使用していましたが、実際には子を完全に切断したくないことに気付きました。私の実験では、終了後に子プロセスが残っているかどうかに切断が影響しているようには見えませんでした。
実験:
これを絶対的な基本にまで煮詰めてみました。したがって、これは私のスクリプトではなく、同じ動作を示す単純化されたテスト ケースです。私は何かが欠けている必要があります。これは正常な動作ではありません。この動作の原因となっている間違っていることを正確に把握するための助けが必要です。
簡略化されたスクリプト:
puts "Tcl version : [info tclversion]"
puts "Expect version: [exp_version]"
while {1} {
# If forking fails, retry every 10 seconds until it succeeds.
if {[catch fork child_pid] == 0} {
break
}
sleep 10
}
sleep 10
# Kills the parent process to return terminal control to shell
if {$child_pid != 0} {
puts "[pid] Parent process exiting..."
exit
}
# Redefine exit procedure for child so it kills the process for sure on exit
# I have no idea why exit doesn't work for a child process, but this seems to ensure it goes away on exit.
#exit -onexit {
# puts "[pid] Killing PID..."
# exec kill [pid]
#}
puts "[pid] Child process sleeping for 10 seconds..."
sleep 10
puts "[pid] Child process waking up and exiting..."
exit
出力を実行します。
:> expect temp_fork
Tcl version : 8.5
Expect version: 5.45
31483 Child process sleeping for 10 seconds...
31472 Parent process exiting...
:> 31483 Child process waking up and exiting...
別のシェルで ps u を実行して、3 時点でプロセスで何が起こっているかを示しました。最初は、親プロセスと子プロセスの両方が生きている 10 秒間のスリープ中です。2 番目は、親プロセスが終了した後でしたが、子プロセスは 10 秒間スリープしていました。3 番目は、子プロセスが終了した後ですが、何らかの理由でプロセスが生きていて眠っているようです。
1位:
:> ps u | grep expect
user 31472 0.2 0.0 6196 2524 pts/2 Sl+ 19:33 0:00 /tools/oss/packages/x86_64-rhel5/expect/default/bin/expect temp_fork
user 31483 0.0 0.0 6196 1456 pts/2 S+ 19:33 0:00 /tools/oss/packages/x86_64-rhel5/expect/default/bin/expect temp_fork
2番目:
:> ps u | grep expect
user 31483 0.0 0.0 6196 1576 pts/2 S 19:33 0:00 /tools/oss/packages/x86_64-rhel5/expect/default/bin/expect temp_fork
3番目:
:> ps u | grep expect
user 31483 0.0 0.0 6196 1700 pts/2 S 19:33 0:00 /tools/oss/packages/x86_64-rhel5/expect/default/bin/expect temp_fork