Я хочу проверить, запущен ли конкретный процесс или нет.
Я ссылался на эти вопросы и ответы .
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
Есть ли другой способ узнать, запущен ли процесс или нет?
Каждый процесс будет указан в выводе 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
разбивает строки на поля на основе пробелов (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"}'
Правильный способ проверить в текущем сеансе 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
), это означает, что процесс все еще выполняется. Если нет, то процесс завершен.
Если ваш сценарий в данный момент запущен, он должен быть показан командой 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
, она будет показана на выходе. Поскольку сценарий в настоящее время запущен.
, если вы просто хотите проверить, есть ли какие-то незавершенные процессы, перейдите в этот каталог и введите ll -tr
, если вы видите .csv
или .work
и т. д. в конце файла, то это значит, что в процессе еще нет.
, если вы хотите проверить все процессы, используйте 'top'
, если вы хотите знать процессы, выполняемые java, используйте ps -ef | grep java
, если другой процесс, просто используйте ps -ef | grep xyz
или просто /etc/init.d xyz status
, если через любой код, например .sh
, то ./ xyz.sh status
вы всегда можете использовать pgrep , чтобы проверить, подсчитывает ли выполняемый процесс
pgrep -c "process name"
, что делает эта команда, сколько процессов было найдено с именем «имя процесса» и возвращает его номер [0 - процесс не найден]