Где хранятся обои?

При запуске ./killProcess.sh somename существует процесс, подобный

/bin/bash ./killProcess.sh somename

, и строка ps | grep | grep | awk также находит это, потому что в нем есть текст somename. Я не совсем уверен, почему у вас есть два дополнительных PID (и не только один), но я считаю, что между bash и killProcess.sh существует несколько родительских / дочерних элементов. В одной строке PID отображается как PID, а другой - как PPID.

Вы можете избежать этих PID, отбросив их на основании имени скрипта. Он сохраняется в $0, поэтому

PID=$(ps -ef | grep $PROCESSNAME | grep -v grep | grep -v $0 | awk '{print $2}');

или (с меньшим количеством программных вызовов):

PID=$(ps -ef | grep $PROCESSNAME | grep -v -e grep -e $0 | awk '{print $2}');

Другой (более безопасный) способ состоял бы в том, чтобы удалить PID сценария , Он хранится в $$:

PID=$(ps -ef | grep $PROCESSNAME | grep -v -e grep -e $$ | awk '{print $2}');

Или все это в awk:

PID=$(ps -ef | awk "/$PROCESSNAME/ && !/awk/ && !/$$/ {print \$2}");

Нам нужно избежать \$2 здесь, чтобы он не был " t интерпретируется оболочкой, но awk. Эта команда означает:

Если строка содержит $PROCESSNAME и не содержит awk и не содержит нашего собственного PID, тогда напечатайте второй столбец.

Преимущество (теоретически), что это работает быстрее, потому что требуется только одна дополнительная команда (awk), а не 3 greps и awk.

Но:

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

killall somename # для предварительного просмотра, первый запуск killall -v -s 0 somename pgrep somename # просто введите PID pkill somename #, аналогичный killall
1
задан 22 November 2012 в 04:54

0 ответов

Другие вопросы по тегам:

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