
経由でLinuxシステムに接続していますssh
。私はセッションからログアウトした後も実行され続けるいくつかのscreen
プロセスを実行していました。ただし、一定時間が経過すると、プロセスはstdout
メモリを占有しても出力の生成を停止します。再度有効にする方法を知りたいです。私のユーザー名の下のプロセスのリストは次のとおりです(top -u MY_USERNAME
)。
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1268 abcdef 20 0 100m 2044 1012 S 0.0 0.0 0:00.03 sshd
1269 abcdef 20 0 105m 1940 1456 S 0.0 0.0 0:00.06 bash
12375 abcdef 20 0 115m 1452 808 S 0.0 0.0 0:00.02 screen # contains python procs
12615 abcdef 20 0 406m 58m 2140 S 0.0 0.0 0:02.23 python # parent process
12618 abcdef 20 0 5170m 4.7g 1176 S 0.0 1.9 546:19.26 python # child process
12619 abcdef 20 0 5164m 4.7g 1172 S 0.0 1.9 539:33.64 python # child process
12620 abcdef 20 0 5185m 4.7g 1172 S 0.0 1.9 547:46.92 python # child process
12621 abcdef 20 0 5171m 4.7g 1168 S 0.0 1.9 540:45.53 python # child process
12622 abcdef 20 0 5179m 4.7g 1172 S 0.0 1.9 546:50.28 python # child process
12623 abcdef 20 0 5171m 4.7g 1168 S 0.0 1.9 549:20.39 python # child process
12624 abcdef 20 0 5178m 4.7g 1172 S 0.0 1.9 543:33.55 python # child process
12625 abcdef 20 0 5177m 4.7g 1172 S 0.0 1.9 545:59.51 python # child process
該当する場合:プロセスにユーザー入力は必要ありません。私は特権を持っていませんsudo
。
下から見ることができますS列にはすべてのプロセスが割り当てられますS
。どのように変更しますかR
?これで出力を再開できますかstdout
?
注:質問を確認しました。ここしかし、これはプロセスを手動で一時停止して目覚めさせることを意味します。最初に私のプロセスがなぜスリープ状態になるのかよくわからないと目覚めたいです。
編集:質問を確認した後ここstrace -p 12622
、サブプロセスのコマンドを実行し、次のようになりますfutex(0x984271b0, FUTEX_WAIT_PRIVATE, 0, NULL
。ウィキペディア一種のロックだったそうですね。これが重要かどうかはわかりません。
答え1
カーネルデザイナーではない場合、「スリープ」はこのプロセス状態の正しい例えではありません。 「待つ」がより良い説明かもしれません。目が覚めるのを待つ直感的な意味で、「眠るもの」を「止まったこと」といいますZ
。
プロセスは、ユーザーが目を覚ますのを待つのではなく、特定の条件が満たされるのを待ちます。たとえば、ファイルからデータを読み取ってディスクからデータがロードされるのを待っているか、ネットワーク接続を提供して着信パケットを待っているか、設定された時間中に一時停止してタイムアウトが期限切れになるのを待ちます。 「目覚める」唯一の方法は、条件を満たすように準備することです。
あなたが見つけたように電話をかけるとstrace -p $PID
(Linuxまたは他のUNIXの亜種に相当するもの)は、プロセスが実行中のタスク、特に待機中のタスクを低レベルの観点から知らせることができます。しかし、これが有用なデータを提供するという保証はありません。 ㅏピューテックス一般に、誰がロックを解除する必要があるかを知る唯一の方法は、プログラムが実行する操作と基本ライブラリがそのコアロック機能をどのように使用するかを正確に理解することです。
プログラムが入力の受信を中断したため、出力生成が中断された可能性があります。プログラムの1つが実行中で、他のプログラムが待機している場合があります。プロセスがデッドロックに陥るバグがプログラムに存在する可能性があります。問題が何であれ、システムの問題ではなくアプリケーションの問題です。プログラムを「目覚めさせる」ための普遍的な方法はありません。プログラムは正常に実行されます。あなたが望むことをしないかもしれませんが、書かれたことをしているのです。