Проверьте процесс и убейте

Я пытаюсь найти, работает ли процесс или нет, и если он запускается, я хочу вызвать скрипт или что-то напечатать. Я пробовал несколько способов, но это дает мне синтаксическую ошибку или команду, не найденную ошибку.

APP_ID = ps -eaf | grep -i `whoami` | grep -i <process_name> | grep -i java | awk '{print$2}' if[''!= '${APP_ID}'] then echo "Stopping instance $APP_ID" 

Я получаю результат, как показано ниже:

 test.sh: line 15: APP_ID: command not found test.sh: line 17: if[!= ${APP_ID}]: command not found Stopping instance 

Что не так в приведенном выше скрипте? И если он имеет некоторые ошибки, то почему он печатает echo в if ?

Также нижеприведенный скрипт терпит неудачу, говоря test.sh: line 3: [ps: command not found

 if [ps -eaf | grep -i `whoami` | grep -i <process_name> | grep -i java]; then echo 'stop' fi 

3 Solutions collect form web for “Проверьте процесс и убейте”

У вашего синтаксиса много проблем:

  • удалите пробелы вокруг «=» при установке переменной

    неправильно:

     APP_ID = value 

    правильно:

     APP_ID=value 
  • для запуска программы и вывода ее в переменную вам нужно $(...) (предпочтительнее в bash, не доступно в sh) или backticks `command` (поддерживается в bash и sh). (и помните, что при назначении переменной кавычки не нужны, но в других случаях они важны: command "$(command)" )

    неправильно:

     APP_ID=command 

    правильно:

     APP_ID=$(command) 
  • добавьте пробелы вокруг всего, когда используете "[", и вам понадобится точка с запятой или новая строка после "]". Это происходит потому, что «[» является встроенной командой bash, а не встроенный – также называется «test» (см. man test ), который, как и другие команды, принимает свои аргументы, разделенные пробелом:

    неправильно:

     if[x!= y] then echo hello world fi 

    правильно:

     if [ x != y ]; then echo hello world; fi 
  • используйте двойные кавычки, а не одинарные кавычки, когда вы хотите развернуть переменную

    неправильно:

     if [ '' != '${APP_ID}' ]; then 

    правильно:

     if [ '' != "${APP_ID}" ]; then 
  • Также для приведенного выше примера вы можете использовать -n (непустой) вместо сравнения с пустой строкой

     if [ -n "${APP_ID}" ]; then 
  • И для примера ps вам не нужны grep и awk:

     APP_ID=$(ps -C whoami --no-header --format 'pid') 

Итак, вот скопированный скрипт:

 APP_ID=$(ps -C whoami --no-header --format 'pid') if [ -n "${APP_ID}" ]; then echo "Stopping instance $APP_ID" fi 

Это проще всего сделать с pgrep и pkill :

 if pgrep process_name 2>/dev/null; then echo "Terminating process_name" pkill process_name fi 

Как указывает пользователь @OrangeDog в комментариях, существует теоретическая возможность того, что этот код оболочки не сможет завершить процесс process_name если процесс возникает между вызовом pgrep и pkill . В этом случае pgrep не обнаружит процесс, и pkill никогда не выполнит. Насколько я понимаю, я не знаю. Если процесс запускается сразу после утверждения, что вы можете сделать?

Просто делать

 echo "terminating process_name (if it is running)" pkill process_name 

в любом случае, чтобы избавиться от надоедливого состояния гонки.

Я не уверен, почему, но вышеупомянутый скрипт не выдавал никаких синтаксических проблем, но не выдавал идентификатор процесса, хотя процесс выполнялся.

Я, наконец, изменил его, как показано ниже, и он работает –

 APP_ID=$(ps -ef | grep <app_name> | grep java | awk '{print $2}') echo "Instance $APP_ID" if [ -n "${APP_ID}" ]; then echo "Stopping instance $APP_ID" fi 

Еще раз спасибо за объяснения и указатели.

@Peter Я снова проведу сценарий, который вы опубликовали, почему он не работает для меня.

  • Почему «kill -9 0» заканчивает сеанс консоли?
  • Пожалуйста, объясните этот вывод команды ps -ef?
  • Как я могу привязать strace к процессу, который не находится в выходе ps?
  • Разница между процессом ps httpd и процессом deamon httpd
  • При каких обстоятельствах pgrep -x не может вернуть действительный pid?
  • Какие флаги команды «ps» предназначены для формата флагов Unix и какие флаги для формата флагов BSD?
  • Использование процессора в соответствии с ps и operf
  • Найти и убить процесс, который использует последовательный порт
  • Почему сортировки корневых процессов не будут сортироваться при попытке сортировки пользователей на основе количества запущенных процессов?
  • Linux: см. Использование ЦП процессом за последнюю секунду
  • Различное представление bash в команде «ps -f»
  • Linux и Unix - лучшая ОС в мире.