Рейтинг:0

Сценарии оболочки — несколько идентификаторов процессов вместо одного

флаг cn

Я пишу простой скрипт bash для выключения tomcat, и если он не останавливается изящно, проверьте, существует ли PID tomcat, и уничтожьте его.

Я передаю имя кота как переменную скрипту, как показано ниже. В некоторых случаях я передаю два или три имени tomcat, поэтому использование FOR LOOP ниже

./shutdown.sh tomcat1

Содержимое скрипта Shutdown.sh

#!/бин/баш
для имени в "$@"
делать
    bash /opt/$name/bin/shutdown.sh   
сделано

спать 30

для имени в "$@"
делать
   process_id=`ps -ef | grep $имя | grep -v grep | awk '{напечатать $2}'`

   если [ $process_id ] 
   тогда
       убить -9 $process_id
   фи

сделано

echo "Выполнение скрипта завершено"

Когда tomcat изящно выключается, проблем нет. Но когда кот не останавливается, у меня проблемы.

Ниже фрагмент кода, запущенный непосредственно в командной строке, дает мне правильный идентификатор процесса (62457) tomcat. Но один и тот же фрагмент сценария оболочки дает мне три идентификатора процесса (62610,62611,62457).

process_id=`ps -ef | grep $имя | grep -v grep | awk '{напечатать $2}'`

Можете ли вы сообщить мне, почему я получаю три идентификатора процесса в сценарии по сравнению с одним?

Любое другое более легкое предложение УБИТЬ?

Josh Zhang avatar
флаг ph
Вместо того, чтобы перебирать возможные PID, почему бы вам просто не передать результаты в `xargs kill -9`? IE: `ps -ef | grep $имя | grep -v grep | awk '{напечатать $2}' | xargs убить -9`
Raj K avatar
флаг cn
Я еще не проверял, но интересно. В сценарии, когда tomcat корректно завершает работу и нет PID для KILL, в основном нет ввода в команду «xargs». будет ли команда xargs жаловаться на синтаксическую ошибку?
Josh Zhang avatar
флаг ph
Если для `xargs kill -9` нет PID, вы на самом деле просто получите сообщение об ошибке от `kill`, так как это будет то же самое, что и запуск команды без каких-либо PID.
Brandon Xavier avatar
флаг us
Ваша команда process_id будет включать в себя саму команду `./shutdown.sh`. Вы можете добавить еще один grep в конвейер, например `. . .| grep -v shutdown.sh | grep -v grep . . .` или сделайте что-то вроде `. . . | egrep -v 'grep|shutdown.sh' . . .`
John Mahowald avatar
флаг cn
Есть ли в вашей операционной системе общий сценарий инициализации или система диспетчера служб? Правильно сделать это в оболочке не так тривиально, как кажется.
Raj K avatar
флаг cn
@BrandonXavier ` | grep -v shutdown.sh | grep -v grep` сработало. Спасибо.
Piotr P. Karwasz avatar
флаг by
Если вы установите `CATALINA_PID` при запуске Tomcat, тогда `shutdown.sh 30 -force` сделает то же самое, что и ваш скрипт (но более правильно). См. [исходный код] (https://github.com/apache/tomcat/blob/76da8deac37071e8a891580d74ba1322c7a2da2c/bin/catalina.sh#L482).

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.