it-roy-ru.com

Как проверить процесс уже запущен или нет

Я хочу проверить, какой процесс уже запущен или нет.

Я судил это вопросы и ответы .

Но я не получил никакого конкретного решения. Ниже приведен пример, который я попробовал: я создал файл abc.sh и запустил этот сценарий в фоновом режиме, например sh abc.sh &.

Теперь этот файл работает в фоновом режиме, и я запускаю команду ps aux | grep "abc".

Ниже приведен вывод этой команды:

prakash     3594  0.0  0.0   4388   820 pts/0    S+   16:44   0:00 grep --color=auto abc

После этого я останавливаю запущенный скрипт abc.sh и запускаю ту же команду ps aux | grep "abc".

Но я получаю такой же вывод, как:

prakash     3594  0.0  0.0   4388   820 pts/0    S+   16:44   0:00 grep --color=auto abc

Есть ли другой способ узнать, запущен ли процесс или нет?

31
Prakash V Holkar

Каждый процесс будет указан в выходных данных ps aux; будь то бег, сон, зомби или остановка.

Однако в вашем случае, поскольку вы запустили процесс с использованием sh abc.sh, sh - это приложение (Shell), которое работает, а не abc.sh. Следовательно, ps aux не будет содержать процесс abc.sh, из-за которого grep не может дать никакого результата.

Итак, правильный способ, которым вы должны были использовать это как:

ps aux | grep sh

Это также может вернуть вам другой процесс, который работает со строкой sh в любом месте своего вывода ps aux.

Следует отметить, что процесс будет "запущен", когда вывод ps aux будет иметь STAT в виде R. Если это что-то отличное от этого, оно не запускается в том случае, если вы запустили команду для проверки запущенных процессов. Различные состояния процесса можно найти на странице руководства для ps:

D    uninterruptible sleep (usually IO)
R    running or runnable (on run queue)
S    interruptible sleep (waiting for an event to complete)
T    stopped, either by a job control signal or because it is being traced
W    paging (not valid since the 2.6.xx kernel)
X    dead (should never be seen)
Z    defunct ("zombie") process, terminated but not reaped by its parent

Вы также можете запустить команду top, чтобы проверить, запущен ли процесс или находится в спящем режиме, а также количество процессоров, RAM, которое он потребляет. (Это снова перечислит ваш процесс как sh).

Однако, если вы хотите, чтобы ваш процесс был указан как abc.sh, тогда у вас должна быть первая строка скрипта, который вы запускаете как:

#!/bin/sh

чтобы оболочка знала, какое приложение использовать для запуска сценария (в данном случае sh, измените его на #!/bin/bash для bash), а затем предоставьте исполняемые разрешения процессу, используя:

chmod +x /path/to/abc.sh

заменив /path/to/ на местоположение файла abc.sh, а затем запустите abc.sh, используя

/path/to/abc.sh

снова заменив /path/to/ на местоположение файла abc.sh.

41
jobin

Моя проблема с grep заключается в том, что это целочисленный парсер. В вашем примере вы ищете "abc", но он возвращает экземпляр grep (который ищет "abc"). Немного круговой Вы можете отфильтровать это, но я нахожу все это немного извращенным.

Я бы обратился к awk за небольшую шалость.

ps aux | awk '$12=="abc.sh"'

awk разбивает строки на поля на основе пробелов (по умолчанию). Поля $ 11 + являются столбцами столбцов команды, поэтому если команда "sh abc.sh ...", $11 будет sh, а $12 будет abc.sh.

Если вы хотите контролировать выход или цепочку с помощью операторов Bash && и ||, вы можете, но вам нужно быть немного умнее. grep выйдет с кодом состояния 1 (технический сбой, триггеры ||), если ничего не найдено, но awk всегда выйдет из кода 0. Мы можем изменить это, сказав ему выйти, если он что-то найдет, и бросить 1, если этого не произойдет:

ps aux | awk '$12=="abc.sh" {exit 0} END{exit 1}' && echo running || echo not running

Конечно, если вы просто хотите записать вывод на экран, вы можете сделать все это в awk:

ps aux | awk '$12=="abc.sh" {print "running"; exit} END{print "not running"}'
6
Oli

Правильный способ проверить в текущем сеансе bash, запущен ли фоновый процесс, такой как sh abc.sh &, уже запущен или нет, это использовать встроенную команду jobs.

Пример:

$ sh abc.sh &
[1] 6917
$ jobs
[1]+  Running                 sh abc.sh &

Это означает, что процесс sh abc.sh, запущенный в фоновом режиме, выполняется. Если процесс завершен, вы увидите что-то вроде:

[1]+  Done                    sh abc.sh

Если в фоновом режиме запущено больше процессов, вы можете ограничить вывод только процессом sh abc.sh, используя:

jobs sh

Смотрите help jobs для получения дополнительной информации.

Вышеуказанный метод будет работать только в текущей сессии bash. Но если вы находитесь в другом сеансе bash (например, в другом окне терминала или вкладке или в скрипте), кроме:

ps aux | grep "[s]h bin/test.sh"

вы также можете использовать:

pgrep -a sh

что кажется мне более простым. Если вы увидите набранную команду в выходных данных (в данном случае sh abc.sh), это означает, что процесс все еще выполняется. Если нет, процесс завершен.

4
Radu Rădeanu

Если ваш скрипт в данный момент выполняется, он должен быть показан командой ps aux. Если он не показан ps, то, возможно, ваш скрипт в данный момент завершен.

Вывод ps, как это означает, что ваш скрипт в данный момент не работает,

$ ps aux | grep hm.sh
avinash   6386  0.0  0.0  15940   932 pts/16   S+   17:34   0:00 grep --color=auto hm.sh

Если это выглядит так, это означает, что ваш скрипт в данный момент выполняется.

$ ps aux | grep hm.sh
avinash   6454  0.0  0.0  16616  1384 pts/16   S+   17:35   0:00 /bin/bash ./hm.sh
avinash   6535  0.0  0.0  15940   932 pts/27   R+   17:35   0:00 grep --color=auto hm.sh

Это все основано на содержании сценария.

Например, если вы создаете такой скрипт, как этот. Отображает сообщение HI о выполнении. Отображение выходных данных занимает несколько секунд, и после получения окончательного результата оно завершается.

#!/bin/bash
echo "HI"

Но если ваш сценарий такой,

#!/bin/bash
Sudo apt-get update

Требуется несколько минут, чтобы завершить процесс. В то же время, если вы запустите команду ps aux | grep filename, она будет показана на выходе. Потому что скрипт в данный момент запущен.

3
Avinash Raj