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

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

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

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

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

36
задан 13 April 2017 в 15:24

7 ответов

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

Однако в вашем случае, поскольку вы запускали процесс с помощью sh abc.sh , sh - это приложение (оболочка), которое работает, а не 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 , чтобы проверить, запущен ли процесс или находится в спящем режиме, а также количество потребляемых ресурсов ЦП и ОЗУ. . (Это снова отобразит ваш процесс как 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 .

44
ответ дан 13 April 2017 в 15:24

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

Я бы обратился к awk для небольшого размаха.

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

awk разбивает строки на поля на основе пробелов (by по умолчанию). Поля $ 11 + - это столбцы команд, поэтому, если команда будет «sh abc.sh ...», $ 11 будет sh и $ 12 будет be 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"}'
7
ответ дан 13 April 2017 в 15:24

Правильный способ проверить в текущем сеансе 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

Для получения дополнительной информации см. задания справки .

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

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

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

pgrep -a sh

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

5
ответ дан 13 April 2017 в 15:24

Если ваш сценарий в данный момент запущен, он должен быть показан командой 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
ответ дан 13 April 2017 в 15:24

, если вы просто хотите проверить, есть ли какие-то незавершенные процессы, перейдите в этот каталог и введите ll -tr , если вы видите .csv или .work и т. д. в конце файла, то это значит, что в процессе еще нет.

-2
ответ дан 13 April 2017 в 15:24
  • , если вы хотите проверить все процессы, используйте 'top'

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

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

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

-2
ответ дан 13 April 2017 в 15:24
  • 1
    Законченный назад в Windows из-за некоторых других проблем драйвера (графический драйвер CPU, не готовый, и thermals, означает ноутбук, всегда работающий горячий... Я верю следующему Ubuntu, LTS в апреле, вероятно, разрешит это). Ваши решения кажутся быть целью проблема, которую я видел, следовательно принимая. Спасибо. – ashic 17 December 2015 в 22:45

вы всегда можете использовать pgrep , чтобы проверить, подсчитывает ли выполняемый процесс

pgrep -c "process name"

, что делает эта команда, сколько процессов было найдено с именем «имя процесса» и возвращает его номер [0 - процесс не найден]

0
ответ дан 5 January 2021 в 23:07

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

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