Intereting Posts
Perge regex получает слово между шаблоном Разрешить другим пользователям копировать файлы из моей папки? Unix файлы, связанные с системой головоломки Как установить отличную от cp? Могу ли я создать символическую ссылку на файл, к которому я не могу получить доступ? Файлы, созданные «make», не получают исполняемых разрешений по умолчанию Linux-видеозахват не работает cam3 или захват изображения в cam1 не работает Как я могу заставить HP Deskjet F4210 работать? Как автоматически применить изменения в папке к другому? Можно ли перечислить только определенные подкаталоги? Как скопировать в форматированное изображение без привилегий root? Как я могу получить HASH главного ключа LUKS? Как grep man-страницы для слова? Как проверить, перезагрузится ли мой компьютер (или завершение работы)? Предпочтительные подходы к удаленной регистрации сценария / демона?

«trap» killall $$; rm -f $ folder2; exit '18 20 24

Что случилось с этой командой?

$ trap 'killall $$ ; rm -f $folder2;exit ' 18 20 24 

Эта команда находится в цикле for , и пока она выполняется, если я нажимаю CTRL- Z, я хочу, чтобы она остановила процесс и folder2 все файлы, которые были созданы (внутри folder2 ) и самой folder2 .

Но когда я нажимаю CTRL- Z в терминале, он останавливается, но после этого я ничего не могу сделать, даже CTRL- C не работает.

Проблема в том, что killall ожидает шаблон, который будет соответствовать имени процесса, а не его PID, а $$ – текущему процессу PID. Вместо этого вы хотите использовать kill .

Кроме того, если вы хотите удалить каталог вместе со всем его содержимым, вам нужен -r в rm :

Наконец, все, что вы делаете после того, как вы убьете свой процесс, не вступит в силу: переместите kill в конец trap и полностью удалите exit :

 trap 'rm -rf "$folder2";kill $$' 18 20 24 

Если вы хотите остановить цикл for от работы перед удалением $folder2 , вы можете использовать break :

 trap 'break;rm -rf "$folder2";kill $$' 18 20 24 

В качестве примера возьмем следующий сценарий:

 #!/bin/bash trap 'echo bye; kill $$' SIGTSTP sleep 30 

Скажем, вы попали в управление-Z во время сна. Это отправит SIGTSTP в группу процессов, которая будет включать в себя sleep и bash. Как объяснялось в ответе Уильяма Пурселла на аналогичный вопрос о Stack Overflow bash, он не запускает обработчик trap до тех пор, пока не закончит выполняемая команда ( sleep ). Однако сон не прекратится: он приостановлен, потому что он также получил SIGTSTP. И в этот момент, потому что он остановлен, он будет игнорировать control-C (SIGTERM), control- \ (SIGQUIT) и т. Д. Ничто не сравнится с SIGKILL.

Таким образом, ваша trap не будет работать (если вы не уйдете и не убьете спящий режим, тогда он немедленно запустится).

Чтобы обойти это, вам нужно будет заставить ваши дочерние процессы игнорировать или не доставлять SIGTSTP, а затем обрабатывать их самостоятельно. Или запустите их в фоновом режиме и wait их:

 #!/bin/bash trap 'echo bye; kill $$' SIGTSTP sleep 30 & wait 

Control-Z фактически работает так, как ожидалось, с этим.