Это действительно зависит от того, что вы подразумеваете под «безопасным». У вас есть два варианта убить процесс:
kill -9
)В большинстве случаев самый чистый и «безопасный» способ завершить процесс — вежливо попросить об этом с помощью SIGTERM. Это связано с тем, что по умолчанию программы распространяют SIGTERM на всех своих дочерних элементов и, таким образом, очищают все дерево процессов. Это также лучше, потому что у завершающихся процессов есть время, чтобы закрыть то, что они делали, чисто (очищая буферы и т. д. ).
Когда вы принудительно завершаете процесс, это не обязательно (или даже по умолчанию )уничтожает дочерние процессы. Имеет тенденцию оставлять сирот. Он также имеет тенденцию повреждать файлы и, как правило, вызывает небольшой беспорядок. Таким образом, очистка с принудительным уничтожением(kill -9
)не должна выполняться автоматически.
Сценарии Bash особенно сложно поддаются очистке. По умолчанию они будут распространять SIGTERM на свои дочерние процессы и ждать завершения своих дочерних процессов. Если по какой-то причине вы отправляете SIGTERM в сценарий bash, и он не завершается, то kill -9
почти наверняка оставит сирот.
Чтобы принудительно убить их, вам нужно принудительно убить скрипт и принудительно убить всех его дочерних элементов. Как правило, это беспорядочно и не рекомендуется в качестве автоматического действия.
К счастью, timeout
знает о проблеме дочерних процессов и стирает все дерево процессов, если его об этом просят.
timeout -s 9 20 myscript
Принудительно завершит все дочерние процессы.Имейте в виду, что это по-прежнему «грязный» способ закрытия команд, поскольку у них нет возможности правильно очистить себя и они могут повредить файлы.
Когда сценарий дойдет до ebs_ocr11
, переменные будут major="34,"
и minor="5". So the
команда grep, ищущая правильную строку из списка rhdiskpower
, будет:
... | grep rhdiskpower | grep "34, *5" | ой...
Поскольку в регулярном выражении не указано, что после переменной $minor
должен быть пробел, выражение будет соответствовать не только 34, 5
, но и 34, 50
, 34, 51
... вплоть до 34, 59
. Таким образом, grep
выведет несколько строк, а awk
удалит из каждой строки все элементы, кроме 10-го, но сохранит их как отдельные строки.
Значением $physical_disk
становится строка, содержащая символы перевода строки:"rhdiskpower5\nrhdiskpower50\nrhdiskpower51\n..."
и т. д.
Я предлагаю изменить эту строку:
physical_disk=`ls -l /dev | grep rhdiskpower | grep "$major *$minor" | awk '{ print $10 }'`
к этому:
physical_disk=`ls -l /dev | grep "$major *$minor.* rhdiskpower[0-9]*$" | awk '{ print $10 }'`
Это также удаляет один дополнительный grep
.
Если команда AIX ls
использует в своих выходных данных символы табуляции вместо пробелов, возможно, вам придется заменить некоторые пробелы в регулярном выражении на \t
или подобное.
Имя диска ASM должно легко считываться с самого диска. Если вы посмотрите на общедоступные описания заголовка блока метаданных ASM и заголовка диска ASM , расположенные сразу после этого, и вычислите смещения, вы обнаружите, что диск ASM довольно легко идентифицировать.:
ORCLDISK
. Сразу после строки может быть строка информации о драйвере для конкретной платформы -или просто нулевой терминатор. Если бы у вас был root-доступ и команда, которая могла бы прочитать строку с фиксированным смещением на блочном устройстве, вооружившись этой информацией, вы могли бы просто перебрать все устройства rhdiskpower*
и проверить, является ли каждое из них ASM-диском. и прочтите идентификационную информацию, если она есть. Это может предложить более надежный способ сопоставления дисков ASM вместо разбора вывода ls
.