Команда 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
).
Это должно быть возможно (по крайней мере, во многих случаях) при наличии постоянного соединения. Тогда можно проверить /proc/PID/fd
на наличие сокетов и FIFO (сложнее, если используются обычные файлы) и найти принадлежащие к ним процессы.
Но я бы не стал полностью блокировать другие процессы, это кажется опасным. Это может привести к блокировке, если вы сделаете ошибку (и может вызвать другие проблемы).
Я предлагаю сбросить приоритет процессора и I/O всех процессов, адаптировать их (renice
, ionice
), а затем восстановить их. Это может стоить 10% производительности основного процесса, но вы на всякий случай.