自分が現在作っているノート型マシンには大きな問題があります。 元々このマシンはCeleronを使っていたんですが、 Pentium4に自分で換装してしまっています。 多分その時グリスをちゃんと塗らなかったからなんだと思うんですが、 CPUを長時間フル稼働していると、 過熱のせいでマシンごと落ちてしまうのです。 とりわけ、カーネルのコンパイルなんかやったら、絶対駄目です。
本来ならばハードウェア的に解決すべきなんですが、 よくやっていたのは、重い作業をしている時、 たまに手動でサスペンドしてやるという方法でした。 しかし、こんな手作業は面倒だし、 やってられてませんから、 こういうスクリプトを書いてみました。
#! /usr/bin/env ruby pid = fork if pid Signal.trap(:TSTP, "SIG_IGN") t = Thread.new do Process.waitall exit end begin pgid = Process.getpgid(pid) while true sleep 10 Process.kill('TSTP', -pgid) sleep 10 Process.kill('CONT', -pgid) end rescue SystemCallError end t.join else exec(*ARGV) exit! 1 end
これで
slow-exec rpmbuild -ba foo.spec
などとすると、
10秒実行して、10秒停止して、
という馬鹿げた作業を自動でやってくれます。
でも、あんまりいいスクリプトじゃないですね。 多分このスクリプトを実行しているプロセス自身は シグナルを無視するようにするよりも、 プログラムを実行する子プロセスをリーダとする、 新しいプロセスグループを作るべきなんでしょうねえ。
David A. Wheelerによる、 バージョン管理システムの比較です。 第三者によって書かれているという意味で、 比較的公正に吟味されてますし、 この種の論文の中ではかなり良い出来です。 一瞬和訳しようかと思ったけど、 結構長いので、やめときます。