1

次のコマンドでRubyprogramBを呼び出すRubyprogramAがあります。

 system("ruby programB.rb <parameters>")

特定の条件下で、programBにその操作(および関連するサブシェル)を終了させたいが、programAが次のパラメーターのセットに進むことを許可したい。

ただし、exit()サブシェルabort()と親の両方Process.kill("SIGTERM",0)を強制終了すると、programBで作業できなくなります(残念ながら、これはWindows上にあります)。私はruby1.9.2を実行しています。

programAを強制終了せずにprogramBを終了するにはどうすればよいですか?

4

3 に答える 3

3

通常のsystem呼び出しがそれをカットしていない場合、通常の方法は次のようなことを行うことです。

pid = fork do
  exec("ruby programB.rb ...")
end

kill("SIGTERM", pid)

このfork操作により、強制終了できるプロセス識別子が得られます。system子プロセスが戻るまでブロックされるため、親プロセスでの呼び出しkillは親プロセスにのみ影響します。

残念ながらfork、Windowsにはありませんが、同じことを実現する代替手段があります。

于 2012-12-22T01:48:00.807 に答える
2

exit()abort()私の経験では、少なくともMac OSとLinuxでは、親を殺さないでください。

これを次のように保存してみてくださいabort.rb

puts RUBY_VERSION
puts `date`
puts 'aborting'
abort

そしてこれはexit.rb

puts RUBY_VERSION
puts `date`
puts 'exiting'
exit

test.rb次に、これを同じディレクトリに保存して実行します。

puts `ruby exit.rb`
puts `ruby abort.rb`

私のシステムでは、次のように表示されます。

1.9.3
Fri Dec 21 22:17:12 MST 2012
exiting
1.9.3
Fri Dec 21 22:17:12 MST 2012
aborting

それらは、サブシェルで現在実行中のスクリプトを終了します。このスクリプトは、ログインシェルではないため終了し、呼び出し元のプログラムにとって重要なリターンステータスを設定できますが、親を強制終了するのはまだわかりません。

STDERRをキャプチャする必要がある場合は、バッククォートを使用するか、機能し%xません。Open3.capture3返されたステータスコードや、STDERRが何かを返したかどうかを知る必要がある場合は、簡単にするために使用することをお勧めします。

于 2012-12-22T03:22:29.030 に答える
0

私にとって確実に機能する唯一のものはこれです:

kill -INT $$

コマンドラインからソースされた場合でも、スクリプトを確実に強制終了し、スクリプトのみを強制終了します。GNU bashバージョン4.4.12(1)-リリース(x86_64-apple-darwin15.6.0)を実行していることに注意してください。これがbash3.xで機能するかどうか思い出せません

于 2017-05-30T13:45:12.580 に答える