Как узнать, какие фоновые программы работают в Linux?
Запустите процесс Unix в фоновом режиме
- Чтобы запустить программу подсчета, которая будет отображать идентификационный номер процесса задания, введите: count https://bloground.ro/ru/%D0%BA%D0%B0%D0%BA-%D1%83%D0%B7%D0%BD%D0%B0%D1%82%D1%8C-%D0%B7%D0%B0%D0%BF%D1%83%D1%89%D0%B5%D0%BD%D0%B0-%D0%BB%D0%B8-%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B0-%D0%B2-linux/» target=»_blank»]bloground.ro[/mask_link]
Linux / Unix команда, чтобы определить, запущен ли процесс?
Мне нужна независимая от платформы (Linux/Unix | OSX) оболочка /bash команда, которая определит, работает ли какой-либо конкретный процесс. например mysqld , httpd . Каков самый простой способ/команда для этого?
Highway of Life 02 фев. 2012, в 16:05
Поделиться
NPE 02 фев. 2012, в 18:08Поделиться:
12 ответов
Лучший ответ
Хотя pidof и pgrep являются отличными инструментами для определения того, что работает, они, к сожалению, недоступны в некоторых операционных системах. Определенным отказоустойчивым было бы следующее: ps cax | grep command
Top 10 Linux Job Interview Questions
Выход на Gentoo Linux:
14484 ? S 0:00 apache2 14667 ? S 0:00 apache2 19620 ? Sl 0:00 apache2 21132 ? Ss 0:04 apache2
Выход на OS X:
42582 ?? Z 0:00.00 (smbclient) 46529 ?? Z 0:00.00 (smbclient) 46539 ?? Z 0:00.00 (smbclient) 46547 ?? Z 0:00.00 (smbclient) 46586 ?? Z 0:00.00 (smbclient) 46594 ?? Z 0:00.00 (smbclient)
В Linux и OS X grep возвращает код выхода, поэтому легко проверить, был ли найден процесс или нет:
#!/bin/bash ps cax | grep httpd > /dev/null if [ $? -eq 0 ]; then echo «Process is running.» else echo «Process is not running.» fi
Кроме того, если вам нужен список PID, вы можете легко grep для них:
ps cax | grep httpd | grep -o ‘^[ ]*[0-9]*’
Выходные данные в Linux и OS X одинаковы:
3519 3521 3523 3524
Вывод следующего представляет собой пустую строку, что делает этот подход безопасным для процессов, которые не выполняются:
echo ps cax | grep aasdfasdf | grep -o ‘^[ ]*[0-9]*’
Этот подход подходит для написания простого теста пустой строки, а затем итерации через обнаруженные PID.
#!/bin/bash PROCESS=$1 PIDS=`ps cax | grep $PROCESS | grep -o ‘^[ ]*[0-9]*’` if [ -z «$PIDS» ]; then echo «Process not running.» 1> do echo $PID done fi
Вы можете протестировать его, сохранив его в файле (с именем «running» ) с разрешениями на выполнение (chmod + x running) и выполнив его с помощью параметра: ./running «httpd»
#!/bin/bash ps cax | grep httpd if [ $? -eq 0 ]; then echo «Process is running.» else echo «Process is not running.» fi
ВНИМАНИЕ.
Пожалуйста, имейте в виду, что вы просто разбираете вывод ps ax , что означает, что, как видно на выходе Linux, это не просто сопоставление процессов, но и аргументы, переданные этой программе. Я настоятельно рекомендую быть максимально конкретным при использовании этого метода (например, ./running «mysql» также будет соответствовать процессам «mysqld» ). Я настоятельно рекомендую использовать which для проверки возможного полного пути.
Linux File Permissions: Commands with Examples — Linux Tutorial 6
Литература:
Caleb Gray 02 фев. 2012, в 20:12
Поделиться
Ах! Отличное использование кода выхода grep.Caleb Gray 03 фев. 2012, в 15:42
Процесс может быть запущен, но остановлен. Поэтому, если целью является проверка того, что mysqld или httpd «работают» (отвечает), вам также следует проверить, остановлен он или нет.
oluc 02 май 2013, в 08:16
Извините, но, хотя ответ, конечно, правильный с семантической точки зрения, я полностью против попытки найти процесс путем сопоставления с образцом в векторе процесса arg. Любой такой подход рано или поздно обречен на провал (вы фактически признаете это сами, говоря, что нужно больше проверок). Я добавил свою рекомендацию в отдельный ответ.
peterh 03 окт. 2013, в 10:41
grep также будет работать (например, ps cax | grep randomname всегда будет возвращать 0, потому что grep находит grep randomname (надеюсь, это понятно . ). Одним из исправлений является добавление квадратных скобок вокруг первой буквы имени процесса, например, ps cax | grep [r]andomname .
Kyle G. 29 окт. 2013, в 03:19
ps cax | rev | cut -f1 -d’ ‘ | rev будет показывать только имя столбца, для облегчения анализа.
Tyzoid 21 май 2015, в 14:56ps cax не может полностью выводить имя команды. Например, он печатает «хром-браузер» вместо «хром-браузер».
jarno 18 июнь 2015, в 22:24
jarno 19 июнь 2015, в 10:24
Kyle G. 19 июнь 2015, в 20:45
Показать ещё 6 комментариевВЫ ДОЛЖНЫ знать ПИД-код!
Поиск процесса путем попытки распознавания образов в аргументах процесса (например, pgrep «mysqld» ) — это стратегия, которая рано или поздно обречена на провал. Что делать, если у вас есть два mysqld? Забудьте о таком подходе. Вы МОЖЕТЕ исправить это временно, и МОЖЕТ РАБОТАть год или два, но потом что-то происходит, о чем вы не думали.
Идентификатор процесса (pid) действительно уникален.
Всегда сохраняйте pid, когда вы запускаете что-то в фоновом режиме. В Bash это можно сделать с помощью переменной $! Bash. Сделав это, вы сэкономите себя.
Как определить, работает ли процесс (pid)
Итак, теперь возникает вопрос, как узнать, работает ли pid.
ps -o pid= -p
Это POSIX и, следовательно, переносимый. Он вернет сам pid, если процесс запущен или ничего не возвращает, если процесс не запущен. Строго говоря, команда вернет один столбец pid , но так как мы указали на пустой заголовок заголовка (материал, непосредственно предшествующий знаку равенства), и это единственный запрашиваемый столбец, то команда ps не будет использовать заголовок вообще. Это то, что мы хотим, потому что оно упрощает синтаксический анализ.
Это будет работать на Linux, BSD, Solaris и т.д.
Другая стратегия — проверить значение выхода из вышеприведенной команды ps . Он должен быть равен нулю, если процесс запущен и не равен нулю, если это не так. Спецификация POSIX говорит, что ps должен выйти > 0, если произошла ошибка, но мне непонятно, что представляет собой «ошибка». Поэтому я лично не использую эту стратегию, хотя я уверен, что она будет работать и на всех платформах Unix/Linux.
peterh 14 фев. 2013, в 18:01
ПоделитьсяЗа исключением того, что это не отвечает на вопрос, который должен определить, работает ли служба. PID не будет известно , в таких случаях, поэтому этот ответ действителен только , если вы знаете PID.
Highway of Life 14 нояб. 2013, в 22:56
Неправильно. Весь мой смысл в комментарии заключается в том, чтобы сделать шаг назад и сказать, что если вы впервые оказались в ситуации, когда вам нужно выполнить какую-то форму grep чтобы найти данный процесс, то вы сделали что-то не так, когда начали процесс, имхо. Я беру это из вопроса ОП, что он действительно контролирует процесс запуска.
peterh 16 нояб. 2013, в 09:40
Более правильным «термином» для вопроса OP должен был быть «кроссплатформенная команда, чтобы определить, запущена ли служба», это не та же система, которая выполняет проверку, а внешняя система, поэтому PID просто не будет известен вообще.
Highway of Life 18 нояб. 2013, в 17:42
То, будет ли известен PID, зависит от того, управляете ли вы процессом запуска или нет. Это не зависит от того, где вы делаете проверку. Вы можете реализовать свой собственный сервис is-service-running? (который использует сохраненный PID) на данном хосте, который затем может быть вызван с удаленного хоста. Но опять же: если вы не контролируете процесс запуска сервиса, тогда я понимаю вашу точку зрения.
peterh 20 нояб. 2013, в 14:46
Да, но сценарии не зависят друг от друга. Вот почему ps cax | grep оказался очень надежным и простым решением.
Highway of Life 20 нояб. 2013, в 22:15
Как определить, работает ли процесс (по pid) именно то, что я искал. Я был удивлен, что все вопросы в моих результатах поиска были о том, как найти pid.
ShadSterling 20 янв. 2016, в 22:33
Это не надежно. Интересующий вас процесс мог умереть после того, как система проработала достаточно долго, чтобы обернуть PID, и тогда другому процессу мог быть назначен тот же PID, который вы проверяете. stackoverflow.com/questions/11323410/linux-pid-recycling
claymation 15 апр. 2016, в 03:28
peterh 15 апр. 2016, в 05:54
Показать ещё 6 комментариевВ большинстве дистрибутивов Linux вы можете использовать pidof (8).
Он распечатает идентификаторы процессов всех запущенных экземпляров определенных процессов или ничего, если экземпляры не запущены.
Например, в моей системе (у меня есть четыре экземпляра bash и один экземпляр remmina ):
$ pidof bash remmina 6148 6147 6144 5603 21598
В других Unices, pgrep или комбинация ps и grep будут достигать того же, что и другие по праву отметили.
Источник: overcoder.net
Как узнать запущен ли процесс?
Когда его запускаю, то все работает, но со временем, он перестает работать.
Перезапускаю его и он опять работает
Как проверить, что он работает в текущий момент?1) Проверяю pid, он существует:
2) Проверяю процессы:
Запускаю его через rc-local.service, для этого создал файл
/etc/rc.local#!/bin/sh -e watcher.py stop watcher.py start exit 0
PS. «watcher.py stop» прописал, так как иногда выдает ошибку, что он уже запущен. Наверное смотрит, что PID создан.
Создал службу, прописал в файле
/etc/systemd/system/rc-local.service[Unit] Description=/etc/rc.local Compatibility ConditionPathExists=/etc/rc.local [Service] Type=forking ExecStart=/etc/rc.local start TimeoutSec=0 StandardOutput=tty RemainAfterExit=yes SysVStartPriority=99 [Install] WantedBy=multi-user.target
Дал ему права и поставил в запуск:
chmod +x /etc/rc.local systemctl enable rc-local systemctl start rc-local
PS. Думаю поставить его на ежедневную перезагрузку в cron. Но пока интересно, как отследить его «падение».
- Вопрос задан более трёх лет назад
- 922 просмотра
Источник: qna.habr.com