Когда я делаю «верх», я вижу свой процесс скрипта perl в состоянии «S». Есть ли способ узнать, что делает этот процесс perl в состоянии сна и способы его разбудить? Любой способ отладки, чтобы дать больше информации о строках в perl-скрипте, заставляя его перейти в состояние «S».
Процесс в состоянии S
обычно находится в блокирующем системном вызове, таком как чтение или запись в файл или в сеть, или ожидание завершения другой вызываемой программы.
Вы можете использовать strace -p <pid>
чтобы узнать, какой системный вызов в настоящее время происходит. Он будет выдавать
написать (1, "foobar" …, 4096
это означает, что процесс пытается записать 4096 байт, начиная с «foobar» в stdout (fd # 1), но все, что было перенаправлено, занято, а выходной буфер заполнен.
Процессы переходят в состояния ожидания, когда они чего-то ждут, обычно I / O.
Ваш процесс будет находиться в состоянии S
когда он делает чтение и, возможно, записи, которые блокируют. Может также произойти при ожидании семафоров или других примитивов синхронизации.
Вы не можете «разбудить его» – он будет действовать только тогда, когда данные / ресурс, который он ожидает, становятся доступными.
Это все нормально и ожидается, и обычно это не проблема. Как правило, эта «программа» выполняется в командной строке без файла:
while (<>) { print; }
будет проводить большую часть своего времени в состоянии сна, что хорошо – вы не хотите, чтобы он терял процессор, пока он ждет ввода пользователя.
Если вы считаете, что это проблема, попробуйте изменить способ ввода / вывода (чтение больших фрагментов, кратковременное увеличение размера блока базового устройства, выполнение ввода / вывода с памятью и т. Д.).