Попробуйте вместо этого:
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
(окончательное обновление? Пальцы скрещены)
Если скрипт init запускается с помощью команды "service", то нам также необходимо отфильтровать родительский PID. Как насчет:
pgrep Processname | grep -v $$ | grep -q -v $PPID
if [ $? -eq 0 ]; then
echo "running"
else
echo "not running"
fi