#linux #bash #shell #variables #command
#linux #bash #оболочка #переменные #команда
Вопрос:
У меня есть команда в переменной в Bash:
check_ifrunning=`ps aux | grep "programmname" | grep -v "grep" | wc -l`
Команда проверяет, запущена ли определенная программа в данный момент.
Позже в моем скрипте я хочу запросить значение переменной в точке.
Если запущена конкретная программа, скрипт должен находиться в режиме ожидания в течение 15 минут.
Я решил это следующим образом:
while [ $check_ifrunning -eq 1 ]; do
sleep 300
done
Будет ли скрипт выполнять команду в переменной для каждого отдельного цикла запуска или значение в переменной останется после первого выполнения?
В моем скрипте есть больше переменных, которые могут изменять свое значение. Это был всего лишь один простой пример этого.
Ответ №1:
Обратите внимание, что check_ifrunning
задается только один раз, в
check_ifrunning=`ps aux | grep "programmname" | grep -v "grep" | wc -l`
и что она устанавливается перед циклом:
while [ $check_ifrunning -eq 1 ]; do
sleep 300
done
Вы могли бы добавить, в целях отладки, echo check_ifrunning is $check_ifrunning
инструкцию внутри вашего while
цикла непосредственно перед sleep
…
Вероятно, вы просто хотите (используя pidof(8)) — без определения или использования какой-либо check_ifrunning
переменной Bash:
while [ -n "$(pidof programname)" ]; do
sleep 300
done
Потому что вы хотите проверить, выполняется ли programname
при каждом запуске цикла!
Вам следует использовать более вложенный и более читаемый вариант $(
… )
вместо обратных кавычек.
Подумайте о том, чтобы прочитать руководство по написанию расширенных сценариев Bash…
Если вы пишете скрипт Bash, подумайте о том, чтобы запустить его с
#!/bin/bash -vx
во время отладки. Когда вы будете удовлетворены, удалите -vx
…
Комментарии:
1. Прежде всего, спасибо за ответ. Значит, я должен «переустанавливать» переменную каждый раз перед циклом? Возможно ли это с помощью функции, которую я вызываю перед каждым циклом? Как уже упоминалось, в моем скрипте есть больше подобных переменных. Они могут меняться во время выполнения скрипта.
2. Узнайте больше о сценариях bash. Используйте
-vx
трюк. Вы, кажется, очень смущены тем, какие переменные есть в bash….
Ответ №2:
Если вы хотите инкапсулировать свои команды, правильный способ сделать это — функция.
running () {
ps aux | grep "$1" | grep -q -v grep
}
С помощью grep -q
вы получаете результат как код выхода, а не как выходные данные; вы используете его просто как
if running "$programname"; then
:
В идеале второе grep
не требуется, но я не хотел слишком усложнять код. Она по-прежнему не будет работать корректно, если вы ищете grep
. Правильное решение таково pidof
.
Смотрите также http://mywiki .wooledge.org/BashFAQ/050