После того, как мой bash-скрипт сделан с сервером selenium, скрипт убивает его так:
kill `ps -ef | grep selenium | awk '{ print $2 }'`
Несмотря на то, что это работает и он уничтожает сценарий селена, он также пытается уничтожить процесс, grep selenium
поэтому к тому моменту, когда номер процесса возвращается к команде kill, процесс завершается, и в итоге он генерирует сообщение об ошибке. (Другими словами: это приводит к уничтожению двух процессов, один из которых - настоящий сервер селена, а другой - мимолетный процесс, который является побочным эффектом от выполнения этой команды.)
Есть ли более изящный способ убить процесс, у которого нет этого непреднамеренного побочного эффекта?
(У меня есть одна идея: этот же сценарий запускает селен ранее в сценарии, так что, возможно, если бы был способ, которым я мог бы захватить PID, когда я запускаю селен, я мог бы просто сохранить это и убить его напрямую, вместо того, чтобы искать для ID процесса. Проблема в том, что я не знаю, как получить этот PID, как использовать переменную, чтобы сохранить его и как ссылаться на него позже в скрипте. Но разве это лучший способ сделать это?)
Попробуйте
pgrep
команду, которая выведет PID интересующей вас команды.Чтобы фактически убить процесс, используйте команду companion
pkill
.источник
pgrep java
и он работает :-) спасибо!pgrep -f selenium
должно сработатьpkill
намного проще.pkill
использует те же критерии соответствияpgrep
, что и вы, так что вы можете сделать это в 1 команде вместо 2 (и полагаться на вывод одной).Попробуйте использовать
grep [s]elenium
. Это не найдет процесс grep.источник
grep
по умолчанию использует BRE. То есть,[
и]
появляются вargv
течениеgrep
, но это не соответствует, потому что[
и]
не используются буквальноgrep
.| grep -v grep
компонент в трубе. Но это довольно элегантно, и мне это нравится!ps -ef | grep \[s]elenium
. Хотя я нашелlsof
гораздо лучшую альтернативу использованиюps
иgrep
.Команда
killall
не упоминалась, и я чувствую, что это полезное дополнение к репертуару.Вы также можете использовать
-r regex
опцию, чтобы указать регулярное выражение для соответствия имени процесса и даже значение времени:Убивает все процессы селена старше 5 минут.
источник
killall
Используйте
-m 1
переключатель с командой grep, чтобы получить только первый найденный процесс. Пока вы сортируете свои процессы по PID, по возрастанию это будет работать.источник