RubyでのUnixプロセス制御メソッドの使用
-
05-07-2019 - |
質問
Ryan Tomaykoは、Unixプロセスコントロールの使用についてこの投稿で非常に激しい嵐を巻き起こしましたコマンド。
これをもっと行う必要があります。これの多く。私はfork(2)、execve(2)、pipe(2)、socketpair(2)、select(2)、kill(2)、sigaction(2)などについて話します。これらは私たちの友達です。彼らは私たちを助けるためだけにひどく望んでいます。
少しのコード(DataMapperの delayed_job
クローンはこれにぴったりだと思いますが、リストされたコマンドをどのように活用するかは明確ではありません。このコードを改善する方法について
def start
say "*** Starting job worker #{@name}"
t = Thread.new do
loop do
delay = Update.work_off(self)
break if $exit
sleep delay
break if $exit
end
clear_locks
end
trap('TERM') { terminate_with t }
trap('INT') { terminate_with t }
trap('USR1') do
say "Wakeup Signal Caught"
t.run
end
end
解決
ああ、そうです...「これ以上のことをすべき」の危険性それらのそれぞれが何をするのか、どのような状況でそれらを使用するのかを説明せずに。 delayed_job
のようなものについては、 fork
を使用していることを知らずに fork
を使用している場合もあります。そうは言っても、それは本当に問題ではありません。 Ryanは、サーバーのプリフォークに fork
を使用することについて話していました。 delayed_job
は、プロセスをデーモンに変換するために fork
を使用します。同じシステムコール、異なる目的。 delayed_job
をフォアグラウンド( fork
なし)とバックグラウンド( fork
あり)で実行すると、パフォーマンスの違いはごくわずかです。
ただし、同時接続を受け入れるサーバーを作成する場合、Ryanのアドバイスは適切です。
-
fork
:元のプロセスのコピーを作成します -
execve
:現在のファイルの実行を停止し、同じプロセスで新しいファイルの実行を開始します(rakeタスクで非常に便利です) -
pipe
:パイプ(2つのファイル記述子、1つは読み取り用、1つは書き込み用)を作成します -
socketpair
:パイプに似ていますが、ソケット用です -
select
:複数のファイル記述子の1つ以上がタイムアウトになるまで待機します -
kill
:プロセスにシグナルを送信するために使用 -
sigaction
:プロセスがシグナルを受信したときの動作を変更できます
他のヒント
5か月後、 http://github.com/antarestrader/Updaterでソリューションを表示できます。 lib / updater / fork_worker.rbを見てください