Проверить процесс и убить, если запущен

Ваша команда пытается скопировать весь диск (if=/dev/sdX) на внешний диск. Я бы предположил, что ваша установка Linux находится на отдельном разделе от вашей установки Windows. Поэтому вам нужно указать этот раздел. Например, if=/dev/sda1. Скорее всего, вам не нужно указывать раздел для внешнего диска, поэтому of=/dev/sdY подойдет.

Чтобы узнать раздел, вы можете загрузиться в Linux OS и df -h или (как root) fdisk -l предоставит вам информацию о разделе.

3
14.07.2016, 01:38
3 ответа

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

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

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 Я еще раз проверю опубликованный вами сценарий о том, почему он у меня не работает.

1
27.01.2020, 21:08

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

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

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

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

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

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

4
27.01.2020, 21:08

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

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

    :

     APP_ID = value {{1 }} 

    справа:

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

    неверно:

     APP_ID = command {{1 }} 

    справа:

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

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

     если [x! = Y], то эхо, привет, мир fi 
     

    правильно:

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

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

     if [''! = '$ {APP_ID}']; то 
     

    право:

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

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

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

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

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

if [ -n "${APP_ID}" ]; then
    echo "Stopping instance $APP_ID"
fi
10
27.01.2020, 21:08

Теги

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