Intereting Posts
Как извлечь все файлы .htaccess из tarball? munin не показывает все порты Ethernet ssh user @ IP sh <команда> пропущенные переменные среды Необходимо удалить – (минус) знак в конце в количестве из многих столбцов и вставить его на удаленные столбцы Не удалось скопировать несколько файлов с помощью версии rsync 3.0.9? установить последнюю версию gcc на rhel 6 x86_64 Генерирование файла с помощью ASCII-номеров с использованием / dev / urandom? Как заставить ssh-copy-id игнорировать существующие авторизованные ключи? rsync -r в существующую папку минимальная установка, все еще хочу гнома! Можно ли перевести linux salted sha512 hash в формат LDAP? Как фильтровать членство в группе с сервера ldap? Использовать mdadm в качестве обходного пути из-за отсутствия поддержки badblocks в btrfs Могу ли я настроить весь красный текст на полужирный в gnome-terminal Как удалить пакет, созданный из источника с тем же именем другого пакета?

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

Когда я делаю «верх», я вижу свой процесс скрипта perl в состоянии «S». Есть ли способ узнать, что делает этот процесс perl в состоянии сна и способы его разбудить? Любой способ отладки, чтобы дать больше информации о строках в perl-скрипте, заставляя его перейти в состояние «S».

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

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

написать (1, "foobar" …, 4096

это означает, что процесс пытается записать 4096 байт, начиная с «foobar» в stdout (fd # 1), но все, что было перенаправлено, занято, а выходной буфер заполнен.

Процессы переходят в состояния ожидания, когда они чего-то ждут, обычно I / O.

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

Вы не можете «разбудить его» – он будет действовать только тогда, когда данные / ресурс, который он ожидает, становятся доступными.

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

 while (<>) { print; } 

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

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