
数年前、私はLinuxでプロセスがランダムにスリープモードに移行するという問題に直面しました。当時、私は/proc
ファイルシステムにプロセスを起こすトリックがあることを知っていました。似たようなことができた記憶が、とんでもないが"echo R" >/proc/pid/stat
正しいコマンドではないようです。
インターネットには、「睡眠プロセスを目覚めさせる方法」に関するホットなトピックがたくさんあります。ほとんどの答えは「ああ、ただ殺してしまう!」です。他の方法があることは分かりますが、今は記憶力が悪いです。
私が今まで試したこと:
kill -SIGCONT <pid>
echo "R" > /proc/<pid>/status
echo "R" > /proc/<pid>/stat
答え1
「睡眠」とはどういう意味ですか?
状態S(中断可能なスリープ)を参照すると、プロセスがI / Oを待っていることを意味します。プロセスは現在ブロックシステムコールを実行しています。一般的な方法で強制的に「目覚めさせる」ことはできません。それでは何をしますか?実行したい入力または出力操作が可能になると、目が覚めます(たとえば、データを読み取ることができるとき、書き込みチャネルが準備されたときなど)。
状態T(中止)を参照すると、プロセスは現在一時停止されていることを意味します。 CONT信号(SIGCONT)を送信して一時停止を解除できます。kill -CONT PID
プロセスは「ランダムにスリープモードに切り替わる」ことはありません。彼らは何もしなければ眠りにつく。 SIGTSTP、SIGSTOP、SIGTTIN、SIGTTOUなどのブロッキング信号を受信すると一時停止します。最後の2つの信号は、バックグラウンドプロセスが端末から読み取り(または書き込み)を試みると、カーネルの端末インタフェースによって送信されます。これを認識しないと、プロセスがランダムに中断されると考えることができます。これが発生した場合は、fg
プロセスが属するジョブを表す正しいパラメータを使用してバックグラウンドジョブを開始したシェルでそれを実行する必要がありますfg %3
。
stat*
Linuxのファイルは/proc
読み取り専用なので、いつ書き込むことができるのかわかりません。そこに何を書きたかったのかわかりません。このファイルによって報告されるデータはカーネル管理データであり、その一部はプロセスによって直接変更される可能性がありますが、外部では変更できません。たとえば、魔法のようにプロセスを実行可能にすることはできません。
答え2
プロセスが信号を処理する方法によって異なります。プロセスが所望の方法で信号を処理しないと、信号の基本的な動作が発生し、一部の信号は捕捉でき、一部は捕捉できません。
わかりませんが、シグナルマニュアルに記載されているように、ストッププロセスとスリーププロセスの違いを確認する必要があります。
Cont Default action is to continue the process if it is currently stopped.
fg
休止プロセスの場合はコマンドです。