как приостановить другие несвязанные процессы для разрешения процесса в интересах занять ЦП?

Команда read происходит в трубопроводе - она находится внутри цикла , в то время как , вход которого перенаправлен из выхода команды find, - таким образом, когда она читает, она считывает из списка файлов find, а не из терминала. Самый простой способ, который я знаю, как это исправить, это отправить список файлов через что-то другое, чем стандартный вход, так что стандартный вход все равно может быть использован для других вещей (например, для подтверждения пользователя). Пока вы не используете файловый дескриптор #3 для чего-то другого, это должно работать:

# ...
while IFS= read -r -u3 -d '' FILE; do
    # same inside of the loop...
done 3< <(find /etc/init.d/* -name '*service' -print0)

-u3 говорит читать читать из FD3, а 3< <(find...) перенаправляет FD3 из вывода команды find. Обратите внимание, что <( ) (известная как подмена процесса) является расширением bash (недоступно в простых позиционных оболочках), поэтому вы должны использовать его только в скриптах, которые начинаются с #!/bin/bash (не #!/bin/sh).

.
1
18.06.2014, 03:29
1 ответ

Это должно быть возможно (по крайней мере, во многих случаях) при наличии постоянного соединения. Тогда можно проверить /proc/PID/fd на наличие сокетов и FIFO (сложнее, если используются обычные файлы) и найти принадлежащие к ним процессы.

Но я бы не стал полностью блокировать другие процессы, это кажется опасным. Это может привести к блокировке, если вы сделаете ошибку (и может вызвать другие проблемы).

Я предлагаю сбросить приоритет процессора и I/O всех процессов, адаптировать их (renice, ionice), а затем восстановить их. Это может стоить 10% производительности основного процесса, но вы на всякий случай.

.
2
27.01.2020, 23:38

Теги

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