Удаление процесса-зомби из таблицы процессов

Это делает это безопасным и портативным способом. Это не запутается странными именами файлов.

for f in *; do [ -d ./"$f" ] && find ./"$f" -maxdepth 1 -exec echo \; | wc -l && echo $f; done

Обратите внимание, что это распечатает количество файлов сначала, затем имя каталога на отдельной строке. Если Вы хотите сохранить формат OP, то Вам будет нужно дальнейшее форматирование, например.

for f in *; do [ -d ./"$f" ] && find ./"$f" -maxdepth 1 -exec echo \;|wc -l|tr '\n' ' ' && echo $f; done|awk '{print $2"\t"$1}'

Если у Вас есть определенный набор подкаталогов, Вы интересуетесь, можно заменить * с ними.

Почему это безопасно? (и поэтому достойный сценария)

Имена файлов могут содержать любой символ кроме /. Существует несколько символов, которые рассматривает особенно или оболочка или командами. Они включают пробелы, новые строки и тире.

Используя for f in * конструкция является безопасным способом получить каждое имя файла, независимо от того, что она содержит.

После того как у Вас есть имя файла в переменной, все еще необходимо избежать вещей как find $f. Если $f содержавший имя файла -test, find жаловался бы на опцию, которую Вы просто дали ему. Способ избежать этого при помощи ./ перед именем; этим путем это имеет то же значение, но это больше не запускается с тире.

Новые строки и пробелы являются также проблемой. Если $f содержавший "привет, приятель" как имя файла, find ./$f, find ./hello, buddy. Вы говорите find смотреть на ./hello, и buddy. Если они не будут существовать, то это будет жаловаться, и это никогда не будет заглядывать ./hello, buddy. Этого легко избежать - кавычки использования вокруг Ваших переменных.

Наконец, имена файлов могут содержать новые строки, так подсчет новых строк в списке имен файлов не будет работать; Вы получите дополнительный счет для каждого имени файла с новой строкой. Для предотвращения этого не считайте новые строки в списке файлов; вместо этого, новые строки количества (или любой другой символ), которые представляют единственный файл. Это то, почему find команда имеет просто -exec echo \; и нет -exec echo {} \;. Я только хочу распечатать единственную новую строку в целях соответствия файлам.

6
21.12.2013, 00:51
2 ответа

Управление таблицей процессов и размещениями в ОЗУ всегда является заданием ядра. Ядро действует, когда некоторый процесс делает системный вызов. Когда процесс выходит, все ресурсы, которые он использует, включая память, за исключением записи в таблице процессов, удалены −, который это что _exit системный вызов делает. Затем когда родительский процесс звонит wait или waitpid, часть задания того системного вызова должна очистить запись таблицы процессов. Родительский процесс может решить звонить wait каждый раз, когда это хочет (если родитель init, это звонит wait в значительной степени все время).

5
27.01.2020, 20:25

Ядро предполагает, что родительский процесс интересуется знанием результата любого дочернего процесса, который это разветвило. Когда дочерний процесс завершается, он автоматически отправляет a SIGCHLD предупредите к родительскому процессу. Если родитель явно игнорирует SIGCHLD сигнал, ребенок сразу очищен и удален полностью (и не становится зомби). Иначе ребенок становится зомби, пока родитель не называет один из wait функции для получения состояния завершения от ребенка.

Если состояние не получено, ребенок остается зомби. Однако, если родительский процесс выходит перед дочерним процессом ребенок усыновлен init (обработайте 1), который сразу собирает состояние, эффективно удаляя процесс-зомби.

4
27.01.2020, 20:25
  • 1
    , но что, если родительский процесс не существует перед, дочерний процесс и родительский элемент получили значение состояния, кто удалит ЗОМБИ? также init? –   29.06.2011, 15:33
  • 2
    @macindows: Да. Если родительский процесс не существует, ответственность передает своему родителю, то родитель того процесса, и так далее. Если никакой другой процесс предка в настоящее время не будет существовать, то он закончится с init. –   29.06.2011, 17:43

Теги

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