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

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

Я реферил этот 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

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

6 ответов

Решение

Каждый процесс будет указан в выводе 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 файл.

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

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

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

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

Если вы хотите контролировать выход или цепочку с помощью Bash's && а также || операторы, вы можете, но вам нужно быть немного умнее. 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"}'

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

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

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

pgrep -c "process name"

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

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

  • если вы хотите проверить все процессы, используйте 'top'

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

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

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

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