はいBashでプログラムでプロセスを作成する。任意の環境変数とコマンドを渡すことができる必要があります。これを達成するために実行してからを/usr/bin/env
呼び出しますbash -c
。時には、起動するプロセスが停止せずに終了したいが、コマンドから返されたPIDを終了すると、次に実行されるサブプロセスの代わりにbashコマンドのみが終了します。強く叩く。
私は見たBashのサブプロセスにSIGTERMを渡すそれで、この問題はbashで解決できると思いましたが、exec
正確な命令を呼び出すことはできません。
たとえば、以下は絶対に終了しないRubyスクリプトです。
STDOUT.sync = true
puts "booted"
while true
puts "running"
sleep 1
end
で実行すると、$ exec ruby spec/fixtures/never_exits.rb
プログラムは期待どおりに動作します。 bash セッションを終了すると、プログラムは終了します。
env
ただし、 like を使用してこのコマンドを実行しようとすると、$ /usr/bin/env bash -c exec ruby spec/fixtures/never_exits.rb
コマンドは出力なしですぐに終了します。スクリプトが呼び出されないようです。
exec
環境変数の指定と組み合わせることができますか?
1行で呼び出すことができるサブプロセスにTERMを伝播する別の方法はありますか?
答え1
タイプ構造を使用するときは、bash -c
コマンド全体を文字に入れる必要があります"
。例えば
$ bash -c echo hello
$ bash -c "echo hello"
hello
だからあなたの場合
env bash -c "exec ruby script.rb"
しかし、その例は実際に多くのことを行いません。初期環境を作るenv
という意味ですか?env -i
また、bash起動スクリプトで魔法のようなことが起こらない限り、bashはまったく必要ないかもしれません。
env -i RUBYPATH=/some/dir RUBYLIB=/other/dir /path/to/ruby script.rb