我通过 .连接到一台 linux 机器ssh
。我曾经在那里screen
运行多个进程,这些进程在我注销会话后将继续运行。然而,一段时间后,尽管进程stdout
占用了内存,但它们仍停止生成输出 (to )。我想知道如何重新激活它们。我的用户名下的进程列表如下所示 ( 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 变体上的等效项)可以从低级视图告诉您该进程正在做什么,特别是它正在等待什么。但是,不能保证这会给您提供有用的数据。 A富泰克斯是一种锁,一般来说,知道谁应该释放锁的唯一方法是准确了解程序正在做什么以及底层库如何使用该核心锁定功能。
程序可能已停止产生输出,因为它们已停止接收输入。有可能其中一个程序正在运行,而其他程序正在等待。可能是程序存在bug,导致进程陷入死锁。不管是什么问题,都是应用程序问题,而不是系统问题。没有通用的方法可以使程序“唤醒”:程序正常运行。它可能没有做你想做的事,但它正在做它被写下来要做的事情。