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

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

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

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

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

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

чтобы оболочка знала, какое приложение использовать для запуска скрипта (в данном случае измените его на #!/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.shavinash   6386  0.0  0.0  15940   932 pts/16   S+   17:34   0:00 grep --color=auto hm.sh

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

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

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

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

#!/bin/bashecho "HI"

Но если ваш сценарий выглядит следующим образом,

#!/bin/bashsudo apt-get update

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

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

pgrep -c "process name"

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

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

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

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

  • если с помощью какого-либо кода, такого как .sh затем ./xyz.sh status

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