仮想の状況があります。
互いを監視する2つのストレス処理S1及びS2があると仮定する。
どうやってこれができますか?
straceのコマンドラインオプションには-p PID
必要なPIDを渡す方法があります。 strace ソースコードを変更できます。これは、-P 0
ユーザーにPIDを要求することを意味します。たとえば、STDINのread()です。 2 つのシェル セッションで 2 つの strace プロセスを実行し、3 番目のシェルで PID を見つけることができる場合は、その入力を S1 と S2 に提供し、互いに監視することができます。
S1とS2が詰まっていますか?それとも無限ループに入ったり、すぐにクラッシュしたり…?繰り返しますが、別のstraceプロセスS3があると仮定し、
-p -1
それを使用してソースコードを変更してS3に自己監視を指示します。たとえば、STDINの代わりにgetpid()を使用します。 S3がクラッシュしますか?それとも追加の処理なしで中断されますか?どんなイベントが発生するのを待っていますが、待っているので何も起こりませんか?
straceのマニュアルページには、initプロセスを監視できないことが示されています。循環依存性や循環を避けるために strace やカーネルによって施行されるその他の制限はありますか?
いくつかの特別な場合:
S4はS5を監視し、S5はS6を監視し、S6はS4を監視します。
S7とS8は、S7がS8の上位になり、互いに監視します。
さらに特別な場合も可能です。
編集(@RalphRönnquistと@pfnueselのコメント後):
https://github.com/bnoordhuis/strace/blob/master/strace.c#L941
if (pid <= 0) {
error_msg_and_die("Invalid process id: '%s'", opt);
}
if (pid == strace_tracer_pid) {
error_msg_and_die("I'm sorry, I can't let you do that, Dave.");
}
strace.c
具体的にpid == strace_tracer_pid
検査が行われない場合やその他特別な事情がある場合はどうなりますか?プロセスモニタ自体に(カーネルに)技術的な制限がありますか? 2つ(または3つ以上)のプロセスグループが自分自身を監視するのはどうですか?システムがクラッシュしたりハングしたりしますか?
ベストアンサー1
% sh -c 'exec strace -p $$'
strace: I'm sorry, I can't let you do that, Dave.
:-)