2016-03-28 3 views
0

Итак, у меня есть сценарий оболочки, который выполняет несколько длительных операций, и когда они это делают, я хочу просто вывести серию точек (.), Пока это не будет сделано, чтобы показать, что это Бег.Bash: Использование pkill для отслеживания прогресса удаления каталога

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

Вот мой код:

ERROR=$(rm -rf "$1" 2>&1 >/dev/null) 
    while pkill -0 rm; do 
     printf "." 
     sleep 1 
    done 
    printf "\n" 

Я использую pkill, чтобы проверить процесс гт, но когда я делаю, это выход я получаю:

pkill: signalling pid 192: Operation not permitted 

pkill: signalling pid 326: Operation not permitted 

.pkill: signalling pid 61: Operation not permitted 

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

У кого-нибудь есть идеи, что происходит? Я чувствую, что он не может работать с операцией rm, но я не уверен.

Заранее благодарен.

+0

Есть несколько процессов, соответствующих 'rm', что у вас нет прав на отправку сигналов. Например.в моей системе: 'pkill -0 rm' дает ' pkill: убить pid 1394 не удалось: операция не разрешена' и 'ps -aux | grep rm' показывает 'dirmngr' (с совпадением' rm' как подстрокой). –

ответ

2

Проблема pkill посылает kill(PID, SIG_0) для процессы совпадение по шаблону Regex rm. Для некоторых согласованных процессов (показаны идентификаторами PID) у вас недостаточно прав для отправки SIG_0, чтобы получить статус процесса.

Вы можете использовать -x (--exact) вариант (без Regex), чтобы соответствовать (ы) только процесс с точным названием rm (Отдано нет rm другими пользователями не работает):

pkill -0 -x rm 

или использовать pgrep

pgrep -x rm 

Лучше указать свое имя пользователя:

pkill -0 -x -u username rm 
pgrep -x -u username rm 
+0

Это замечательно, за исключением положения точного флага. Это должно быть pkill -0 -u username -x rm. Это то, что сработало для меня – user2223059

+0

@ user2223059 oops..you правы, сигнал должен быть вначале .. я написал его из head..fixed .. – heemayl

0

Ваш сценарий не помещает rm в фоновом режиме, поэтому, когда запускается pkill, возможно, он находит процессы, принадлежащие другим пользователям, и не может их убить, потому что вы не можете убить процесс другого пользователя, если вы не являетесь пользователем root.

Поскольку вы порождая процесс в сценарии, если вы правильно фон rm, то вы можете получить PID из rm работы от $! и использовать kill вместо pkill.

Вы должны запустить команду rm и правильно ее фон. Следующий непроверенный код должен делать то, что вы пытаетесь сделать:

rm -rf "$1" >/dev/null 2>&1 & 
RMPID=$! 
while kill -0 $RMPID 2>/dev/null; do 
    printf "." 
    sleep 1 
done 
printf "\n" 
wait $RMPID 
RESULT=$? 
if (($RESULT != 0)); then 
    printf "Error when deleting $1\n" 
    exit 1 
fi 

Вы можете прочитать документацию Баш для получения более подробной информации о wait и $! и $?

+0

Я изначально пытался использовать kill для этого, но я никогда не смог заставить его работать правильно. pkill работал для меня, поэтому я побежал с ним. Следуя вашим указаниям, я на мгновение заработал, но в конце цикла он дает мне ошибку «нет такого процесса» после вывода нескольких раз. – user2223059

+0

Кроме того, результат, который, похоже, хорошо работает для меня. Я по-прежнему относительно новичок в сценариях оболочки, но перенаправление 2> & 1 привело к выходу ошибки, который>/dev/null отослал все остальные выходные данные. Это успешно сработало для меня в нескольких других местах моего кода. – user2223059

+0

Вы правы, заказывая вопросы о переадресации, и мой комментарий был бы применен, если бы они были отменены. – Julian

Смежные вопросы