сокращение вывода от 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 - удаленный myXpdfServer

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

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

0
задан 19 August 2015 в 09:34

2 ответа

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

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

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


Когда Вы делаете isRunning=$(ps -ef | grep -q '[ ]xpdf ') Ваша переменная установлена на пустую строку потому что grep -q не производит вывода. Код возврата последней команды, выполненной оболочкой, доступен в переменной оболочки $?. Это будет 0 для истинного, т.е. grep, подобранный или ненулевой (обычно 1) иначе. Значение для ожидания показывают в разделе EXIT STATUS man grep.

Таким образом, если Вы хотите держаться за результат, можно сделать, например:

ps -ef | grep -q '[ ]xpdf '
isRunning=$?
if [ $isRunning = 0 ]
then echo "running. isRunning=$isRunning"
else echo "not. isRunning=$isRunning"
fi
1
ответ дан 1 October 2019 в 03:57

я хочу обусловить на том, работает ли определенный процесс.

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

pidof nameofyourprogram 

, Посмотрите страница справочника для существовать состояния для Вашего условия.

0
ответ дан 1 October 2019 в 03:57

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

Похожие вопросы: