Планировщику все равно, почему процесс в данный момент не запускается.
Состояние S
используется всякий раз, когда процесс вызвал системный вызов, который требует завершения внешнего события; на этом этапе не имеет значения, вызвал ли сам системный вызов внешнее событие (например, вызов read
), или он просто ждет (например, select
или poll
) ).
Вы можете узнать, какой системный вызов ожидает процесс, включив столбец WCHAN
в вверху
.
Состояние D
в наши дни становится немного редкостью, оно обычно использовалось, если текущий системный вызов нельзя было легко остановить без потенциального повреждения данных. Печально известным примером был клиент NFS, который переходил в состояние D
во время каждой операции с файлом, потому что нет способа прервать запрос, который мог или не мог быть получен сервером. При более агрессивном кэшировании слой кеша теперь будет видеть запрос, в то время как пользовательский процесс делает что-то еще.
Вы можете использовать внутри for-loop
, как показано ниже:
for i in {0001..9999}; do
grep -q 'specificString' <<<"$(nc localhost $i)" && \
echo "found on $i" || echo "not found on $i";
done
Для оболочек, которые не поддерживают раскрытие фигурных скобок или не сохраняют заполнение нулями:
i=0
while [ "$i" -le 9999 ]; do
printf '%04d\n' "$i"
i=$(( i + 1 ))
done | nc...other options... | grep...etc...