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

32

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

Я судил этот Q & A .

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

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

Пракаш В Холкар
источник

Ответы:

41

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

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

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

ps aux | grep sh

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

Вы должны заметить, что процесс будет «запущен», когда на выходе ps auxбудет свой STATas 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файла.

Jobin
источник
2
Один быстрый вопрос. что такое stat S+означает
Prakash V Holkar
Но вы можете найти разницу между запущенными процессами и не запущенными процессами с помощью вывода ps aux | grep filenameкоманды.
Авинаш Радж
@TechGuru: Это означает, что процесс спит на переднем плане, для получения дополнительной информации обратитесь к странице справочника ps.
Jobin
@AvinashRaj: Да, конечно, вы можете.
Jobin
Я получаю сообщение об ошибке: Ошибка, сделайте это: mount -t proc proc / proc
IgorGanapolsky
7

Моя проблема в 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"}'
Оли
источник
4

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

Раду Рэдяну
источник
3

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

Авинаш Радж
источник
-2
  • если вы хотите проверить все процессы, используйте 'top'

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

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

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

Umman
источник
1
-1 Хотя эти команды полезны при некоторых обстоятельствах, они все равно будут бесполезны для тех, кто не знает этих обстоятельств. В каждом случае вы либо объясняете их недостаточно, либо ваше объяснение неверно.
Дэвид Фёрстер
-2

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

Umman
источник
Этот ответ не имеет смысла. Перечисление содержимого каталога не скажет вам, запущен ли процесс. Расширение файла .csvпредназначено для файлов с разделителями-запятыми, которые не связаны с запущенным процессом.
user369450