Ваша команда пытается скопировать весь диск (if=/dev/sdX) на внешний диск. Я бы предположил, что ваша установка Linux находится на отдельном разделе от вашей установки Windows. Поэтому вам нужно указать этот раздел. Например, if=/dev/sda1
. Скорее всего, вам не нужно указывать раздел для внешнего диска, поэтому of=/dev/sdY
подойдет.
Чтобы узнать раздел, вы можете загрузиться в Linux OS и df -h
или (как root) fdisk -l
предоставит вам информацию о разделе.
Я не уверен, почему, но в приведенном выше сценарии не возникало никаких проблем с синтаксисом, но не выдавался идентификатор процесса, хотя процесс был запущен.
Я наконец изменил его, как показано ниже, и он работает -
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 Я еще раз проверю опубликованный вами сценарий о том, почему он у меня не работает.
Это проще всего сделать с помощью 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
, чтобы избавиться от надоедливого состояния гонки в любом случае.
удалите пробелы вокруг "=" при неправильной установке переменной
:
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