сценарий оболочки linux вопрос малыша - PullRequest
2 голосов
/ 26 февраля 2010

скрипт оболочки Unix с единственной целью - подсчитать количество запущенных процессов qmail (может быть что угодно еще). Легкая вещь, но в коде должна быть какая-то ошибка:

#!/bin/bash
rows=`ps aux | grep qmail | wc -l`
echo $rows

Из

echo $rows

всегда показывает большее количество строк (11), чем если бы я просто считал строки в

ps aux | grep qmail

Всего 8 строк. Так ли это работает в вашей системе?

Ответы [ 6 ]

3 голосов
/ 26 февраля 2010

В настоящее время в Linux есть pgrep. Если у вас это есть в вашей системе, вы можете пропустить grep -v grep

$ var=$(pgrep  bash) # or `pgrep bash | wc -l`
$ echo $var
2110 2127 2144 2161 2178 2195 2212 2229
$ set -- $var; echo ${#}
8

также, если ваша команда ps имеет опцию -C, другой способ

$ ps -C bash -o pid= | wc -l

если нет, вы можете установить класс символов в шаблоне grep

$ ps aux|grep [q]mail | wc -l
2 голосов
/ 26 февраля 2010

Похоже, что вы подсчитываете сам процесс grep и строку заголовка, которую ps обычно печатает перед его выводом.

Я бы предложил что-то более похожее на:

qprocs = $ (ps auxwww | grep -c "[q] mail")

... обратите внимание, что GNU grep имеет переключатель "-c", чтобы он печатал "количество" совпадений, а не сами строки. Хитрость с регулярным выражением состоит в том, чтобы сопоставить qmail без совпадения с литеральной строкой, которая находится в командной строке grep. Таким образом, мы берем любой отдельный символ в строке и заключаем его в квадратные скобки, так что это один символ «класс». Регулярное выражение: [q] mail соответствует строке qmail без соответствия строке [q] mail .

Обратите внимание, что даже с этим регулярным выражением вы все равно можете найти некоторые ложноположительные совпадения. Если вы действительно хотите быть более точным, то вы должны предоставить пользовательскую строку выходного формата для вашей команды ps (см. Справочные страницы), или вы должны передать ее через конвейер, или вам нужно проанализировать вывод команды ps в полях (используя awk или cut или while read loop). (Опция -o для ps является самой простой среди них).

1 голос
/ 26 февраля 2010

Нет, так как я не бегаю qmail.Однако вы, как минимум, захотите исключить процесс, выполняющий ваш grep:

ps aux | grep qmail | grep -v grep

Для отладки вы можете выполнить:

rows=`ps aux | grep qmail`
echo $rows >debug.input
od -xcb debug.input

(чтобы увидеть вашвведите в сценарий * * * * * подробно, а затем временно переписайте сценарий следующим образом:

#!/bin/bash
rows=`cat debug.input | wc -l`
echo $rows

Таким образом, вы сможете увидеть входные данные и выяснить, какой эффектон есть в вашем коде, даже когда вы отлаживаете его.

Хороший отладчик со временем научится изменять только одну переменную за раз.Если вы изменили свой код, чтобы он заработал, это переменная - также не допускайте изменения ввода в ваш код.

0 голосов
/ 26 февраля 2010

pgrep есть во многих дистрибутивах Linux, и я думаю, что он доступен для других Unix.

[dan@khorium ~]$ whatis pgrep
pgrep                (1)  - look up or signal processes based on name and other attributes
[dan@khorium ~]$ pgrep mingetty
1920
1921
1922
1923
1924

В вашем случае, pgrep qmail | wc -l должен добиться цели.

0 голосов
/ 26 февраля 2010

Несколько способов ...

ps -e | grep ' [q]mail' | wc -l
ps -C qmail -opid= | wc -l
pidof qmail | tr ' ' '\n' | wc -l
0 голосов
/ 26 февраля 2010

Использование

$ /sbin/pidof qmail

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...