Помогло бы, могли ли Вы описать грамматику, Вы в настоящее время используете для синтаксического анализа. Кажется, что проблема могла бы заключаться там!
Редактирование:
то, что Вы не понимаете вопроса о грамматике и что 'Вы записали, это вручную' очень вероятно объясняет, почему у Вас есть проблемы с выражениями формы '1+11*5' (т.е. с приоритетом оператора). Гугление для 'грамматики для арифметических выражений', например, должно привести к некоторым хорошим указателям. Такая грамматика не должна быть сложной:
::= + |
- |
::= * |
/ |
::= x | y | ... |
( ) |
- |
добился бы цели, например, и может быть тривиально увеличен для заботы о некоторых более сложных выражениях (включая функции, например, или полномочия...).
я предлагаю, чтобы Вы взглянули на этот поток, например.
Почти все введения в грамматики/парсинг рассматривают арифметические выражения как пример.
Примечание, что использование грамматики нисколько не подразумевает использование определенного инструмента ( а-ля Yacc, Бизон...). Действительно, Вы несомненно уже используете следующую грамматику:
:: |
:: + | - | * | /
:: | ()
(или что-то вроде вида), не зная это!
Попробуйте вместо этого:
ps aux | grep -q "[p]rocessName"
if [ $? -eq 0 ]; then
echo "running"
else
echo "not running"
fi
Скобки вокруг первой буквы processName означают, что «grep -v grep» не нужен, а -q означает, что нам не нужен по каналу к / dev / null
$? дает вам код возврата предыдущей выполненной команды. Следовательно, проверка, был ли он равен 0, будет указывать на то, что "grep" нашел то, что искал.
Обновление
Если имя вашего процесса действительно короткое (скажем, "чашка"), вы можете получить ложное срабатывание, поскольку оно может сопоставьте также другие процессы (скажем, "cupsd"). Вы можете преодолеть это, задав для поиска целые слова с помощью grep - добавьте флаг «-w».
Не то чтобы этот метод не идеален. Вы можете закончить совпадение записей в полях имени пользователя / даты. Если это произойдет, найдите «man ps» и более избирательно подходите к тому, что вы распечатываете, прежде чем выполнять команду grep. В качестве альтернативы, предварительно отфильтруйте вывод с помощью awk, чтобы извлечь только столбец, показывающий имя процесса / cmd. Например:
ps aux | awk '{print $11}' | grep -q -w "[p]rocessName"
if [ $? -eq 0 ]; then
echo "running"
else
echo "not running"
fi
Обновление 2
, вы также можете использовать pgrep, как предлагается в ответе ниже.
Для очень коротких имен процессов вы можете указать границы слов (\ b) до и после имени вашего процесса, чтобы предотвратить избыточное соответствие (как описано выше)
pgrep "\bprocname\b" > /dev/null
if [ $? -eq 0 ]; then
echo "running"
else
echo "not running"
fi
Обновление 3
Из обновленного вопроса я вижу, что вы запускаете его из сценария инициализации. Всегда есть опасность, что pgrep будет соответствовать самому скрипту. Попробуйте:
pgrep Processname | grep -q -v $$
if [ $? -eq 0 ]; then
echo "running"
else
echo "not running"
fi
Это исключает PID скрипта из совпадений pgrep.
Обновление 4
(последнее обновление? Скрещенные пальцы)
Если скрипт инициализации запускается с помощью команды "service", тогда нам нужно чтобы также отфильтровать родительский PID. Как насчет:
pgrep Processname | grep -v $$ | grep -q -v $PPID
if [ $? -eq 0 ]; then
echo "running"
else
echo "not running"
fi
Вероятно, потому что grep "processName"
обнаруживает себя. Вчера я обнаружил ту же самую проблему, за исключением того, что я xarg
выдавал результаты на kill
...
В качестве альтернативы вы можете попробовать pgrep
] вместо вашей строки ps
и различных grep
s:
sd@camel:~$ pgrep bash
415
3477
sd@camel:~$ echo $?
0
sd@camel:~$ pgrep arf
sd@camel:~$ echo $?
1
Добрый день,
В стороне, вместо
ps ax | grep -v grep | grep "processName"
Попробуйте выполнить
ps ax | grep "[p]rocessName"
ps перечисляет функцию grep, потому что она видит строку "grep processName" в список процессов, который передается вашей grep для строки «processName».
Grepping для «[p] rocessName» будет соответствовать только «processName» сам по себе, но не строке «grep [p] rocessName».
вы не проводите тест. заключите условие теста в скобки, например:
if [условие вашего тестирования]