Как проверить процесс уже запущен или нет
Я хочу проверить, какой процесс уже запущен или нет.
Я реферил этот 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