Сокращая вывод команды 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
См. Справочную страницу о существующем статусе вашего состояния.