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

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

Я ссылался на эти вопросы и ответы .

1110 Но я не получил никакого конкретного решения. Ниже приведен пример, который я попробовал: я создал файл 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

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

32
задан 13.04.2017, 15:24

5 ответов

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

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

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

ps aux | grep sh

Это может также возвратить Вас другой процесс, которые выполняют наличие строки sh куда угодно в их выводе [1 113].

необходимо отметить, что процесс будет "работать", когда вывод [1 114] будет иметь STAT как [1 116]. Если это - что-то другое, чем которое, это не работает в экземпляре, Вы запустили команду для проверки рабочих процессов. Различные состояния процесса могут быть найдены в странице справочника для 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, это использует. (Это снова перечислит Ваш процесс как [1 118]).

Однако, если Вы действительно хотите, чтобы Ваш процесс был перечислен как [1 119], тогда у Вас должна быть первая строка сценария, который Вы выполняете как:

#!/bin/sh

так, чтобы оболочка знала, что приложение использовать для выполнения сценария (sh в этом случае измените ее на [1 120] для удара), и затем предоставьте исполняемые полномочия использованию процесса:

chmod +x /path/to/abc.sh

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

/path/to/abc.sh

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

41
ответ дан 07.10.2019, 18:23
  • 1
    Один быстрый вопрос. что является статистикой S+ средства – Aren Cambre 29.05.2014, 15:09
  • 2
    Но можно найти различие между выполнением процессов и не выполнением процессов через вывод ps aux | grep filename команда. – OMG Ponies 29.05.2014, 15:10
  • 3
    @TechGuru: Это означает, что процесс спит на переднем плане, обратитесь к странице руководства PS для больше. – Aren Cambre 29.05.2014, 15:10
  • 4
    @AvinashRaj: Да, конечно, Вы можете. – Aren Cambre 29.05.2014, 15:11
  • 5
    Я получаю ошибку: Ошибка, сделайте это: смонтируйте-t proc proc/proc – Stefan Steiger 23.01.2017, 02:08

Моя проблема с 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

, Конечно, если Вы просто заботитесь о записи выведенного на экран, Вы могли бы сделать это все в [1 116]:

ps aux | awk '$12=="abc.sh" {print "running"; exit} END{print "not running"}'
7
ответ дан 07.10.2019, 18:23

Если Ваш сценарий в настоящее время работает, его нужно показать 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

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

, Например, если Вы создаете сценарий как это. Это отображает сообщение ПРИВЕТ на выполнении. Это занимает несколько секунд для отображения вывода и было завершено после того, как это приведет к конечному результату.

#!/bin/bash
echo "HI"

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

#!/bin/bash
sudo apt-get update

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

3
ответ дан 07.10.2019, 18:23

Правильный способ зарегистрироваться в текущей сессии удара, если процесс, запущенный в фоне, как 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 для большего количества информации

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

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

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

pgrep -a sh

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

4
ответ дан 07.10.2019, 18:23
  • , если Вы хотите проверить, все процессы затем используют 'вершину'

  • , если Вы хотите знать, что процессы, выполненные Java затем, используют ps -ef | grep java

  • , если другой процесс затем просто использует ps -ef | grep xyz или просто /etc/init.d xyz status

  • если через какой-либо код как .sh затем ./xyz.sh status

-2
ответ дан 07.10.2019, 18:23
  • 1
    - 1, В то время как эти команды полезны при некоторых обстоятельствах, они все еще будут бесполезны кому-то кто doesn' t знают эти обстоятельства. В каждом случае Вы любой don' t объясняют их достаточно, или Ваше объяснение является неправильным. – John Powell 24.05.2016, 10:47

Теги

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