Как знать причину процесса, засыпающего состояние, и разбудить его?

sed s/@var@/$VALUE/g <config.in >config, но остерегайтесь случайных наклонных черт / в $VALUE - Вы, возможно, должны были бы выйти из них или использовать другой символ разделителя.

19
11.04.2012, 09:50
2 ответа

Процессы засыпают состояния, когда они ожидают чего-то, обычно ввод-вывод.

Ваш процесс будет в S заявите, когда это делает чтения и возможно пишет, что блокируются. Может также произойти при ожидании на семафорах или других примитивах синхронизации.

Вы не можете "разбудить его" - это только продолжится, когда данные/ресурс, которых это ожидает, станут доступными.

Это все нормально и ожидается, и не обычно проблема. Как правило, эта "программа" работает на командной строке без файла:

while (<>) { print; }

проведет большую часть его времени в состоянии сна, которое хорошо - Вы не хотите, чтобы оно потратило впустую ЦП, в то время как оно ожидает ввода данных пользователем.

Если Вы думаете, что это - проблема, попытайтесь изменить способ, которым Вы делаете свой ввод-вывод (читающий большие блоки, в хороших кратных числах размера блока базового устройства, делая ввод-вывод с отображенной памятью, и т.д.).

5
27.01.2020, 19:45

Процесс в S состояние обычно находится в блокирующемся системном вызове, таком как чтение или запись в файл или сеть или ожидание другой названной программы для окончания.

Можно использовать strace -p <pid> узнать, какой системный вызов в настоящее время происходит. Это произведет вывод как

запишите (1, "foobar"..., 4096

то, что означает, что процесс пытается записать 4 096 байтов, запускающихся с "foobar" к stdout (fd № 1), но независимо от того, что он был перенаправлен в, занято, и буфер вывода полон.

22
27.01.2020, 19:45

Теги

Похожие вопросы