Сокращая вывод команды ps efo cmd | Grep

Я хочу указать, работает ли определенный процесс. Процесс имеет очень длинное описание, более или менее похожее

/usr/bin/xpdf -remote myXpdfServer -title Bayes2_notes -papercolor cornsilk -geometry 1910x1019+0+29 /home/simon/research/Ward/Bayes2_notes.pdf

Иногда мне приходится использовать xterm с небольшим количеством столбцов, скажем, n. В этом случае, если я запускаю ps -ef, тогда grep для некоторого элемента далеко в хвосте этой строки, ps обрезает строку, возвращая только первые n символов, и моя команда grep не выполняется.

Чтобы это исправить, я попробовал ps efo cmd | grep и т. д. Это помогает некоторым, но не так сильно, как мне нравится. Например очевидная команда, чтобы попробовать:

ps eco cmd | grep xpdf | grep -v grep

возвращает следующее:

|.................................. \ _ / usr / bin / xpdf -remote myXpdfServer

где эти точки обозначают пробелы, которые не отображаются на этом форуме. Я бы очень хотел избавиться от мусора, особенно пробелов, в начале, то есть всего, что предшествует /usr. Обратите внимание, что в этом случае не поможет конвейерная обрезка, или sed, или что-то еще: длина строки, возвращаемой ps, определяется числом столбцов xterm, поэтому сокращение этой строки с помощью постобработки мне не поможет, потому что строка, которую я должен исследовать, уже обрезана к тому времени, когда cut выполняет свое дело. Я уверен, что единственный способ сделать то, что я хочу сделать, это добавить какой-нибудь другой флаг в команду ps ef.

Большое спасибо за любой совет!

2 ответа

Решение

ps -ww обеспечивает неограниченную ширину вывода. Вы можете использовать столько командной строки, сколько захотите. Если вы префикс вашей строки, чтобы соответствовать [ ] тогда grep не будет соответствовать самому себе. Если вы добавляете -q в grep, то ничего не выводится, но вы можете использовать код возврата: он будет равен 0, если найден, и 1 в противном случае. Так

if ps alxww | grep -q '[ ]/usr/bin/xpdf -remote myXpdfServer -title Bayes2_notes -papercolor cornsilk -geometry 1910x1019+0+29 /home/simon/research/Ward/Bayes2_notes.pdf'
then echo running
else echo not
fi

grep фактически соответствует шаблонам, а не точным строкам. В шаблоне присутствуют "магические" персонажи, которые не стоят сами за себя. К счастью, строка командной строки, к которой вы обращаетесь, не имеет магических символов, поэтому ваш шаблон точно соответствует строке. Некоторые магические символы [, *, ., (, +, В частности картина [ ] означает совпадать с пробелом. Так что это явно бессмысленный паттерн, потому что это то же самое, что и само пространство: " ".

Но, как вы знаете, делает ps|grep string найдет команду grep, а также интересующую нас команду. Но с помощью [ ]grep больше не будет соответствовать своей собственной команде, потому что в выводе команды ps будут 3 символа "[ ]", а не один символ " ", поэтому шаблон (1 пробел) не будет совпадать.

Это немного сложно понять. Вы можете прочитать о шаблонах, которые называются регулярными выражениями, в man grep, Они невероятно полезны.


Когда вы делаете isRunning=$(ps -ef | grep -q '[ ]xpdf ') ваша переменная установлена ​​на пустую строку, потому что grep -q не производит никакого вывода. Код возврата последней команды, запущенной оболочкой, доступен в переменной оболочки $?, Это будет 0 для истины, то есть совпадения grep, или ненулевое (обычно 1) в противном случае. Ожидаемое значение отображается в разделе " СОСТОЯНИЕ ВЫХОДА " man grep,

Так что если вы хотите сохранить результат, который вы можете сделать, например:

ps -ef | grep -q '[ ]xpdf '
isRunning=$?
if [ $isRunning = 0 ]
then echo "running. isRunning=$isRunning"
else echo "not. isRunning=$isRunning"
fi

Я хочу указать, работает ли определенный процесс.

я хотел бы использовать

pidof nameofyourprogram 

См. Справочную страницу о существующем статусе вашего состояния.

Другие вопросы по тегам