Як перевірити процес вже запущений чи ні


32

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

Я рецензував це питання .

Але конкретного рішення я не отримав. Наведемо приклад, який я спробував: я створив 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має його STATяк R. Якщо це щось інше, ніж це, воно не працює в тому екземплярі, який ви запустили, щоб перевірити запущені процеси. Різні стани процесу можна знайти на сторінці man для 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/bashbash), а потім надасть виконавчі дозволи процесу, використовуючи:

chmod +x /path/to/abc.sh

заміна /path/to/з місцем розташування abc.shфайлу , а потім запустити з abc.shдопомогою

/path/to/abc.sh

знову замінивши /path/to/розташування abc.shфайлу.


2
Одне швидке запитання. що є stat S+означає
Пракаш V Холкар

Але ви можете знайти різницю між запущеними процесами і не запущеними процесами через вихід 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


1
-1 Хоча ці команди корисні за певних обставин, вони все одно будуть марні для тих, хто не знає цих обставин. У кожному випадку ви або не пояснюєте їх достатньо, або ваше пояснення неправильне.
Девід Фоерстер

-2

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


Ця відповідь не має сенсу. Перерахування вмісту каталогу не скаже вам, чи працює процес. Розширення файлу .csvпризначене для файлів з обмеженими комами, які не пов'язані з запущеним процесом.
user369450
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.