Linux bash проверка запущен ли процесс

Содержание
  1. Как проверить процесс уже запущен или нет
  2. Как проверить процесс уже запущен или нет
  3. 6 ответов
  4. Как определить, запущен процесс или нет, и использовать его для создания условного сценария оболочки?
  5. Почему?
  6. Итак, как мне надежно протестировать определенный процесс?
  7. Я хочу убедиться, что служба abc запущена, и если нет, запустите ее
  8. ABC это мой сценарий. Мне нужно убедиться, что запущен только один экземпляр моего скрипта.
  9. Как определить, запущен процесс или нет, и использовать его для создания условного сценария оболочки?
  10. 13 ответов
  11. Почему?
  12. Итак, как мне надежно проверить определенный запущенный процесс?
  13. Я хочу убедиться, что служба abc запущена, а если нет, запустите ее
  14. abc — мой сценарий. Мне нужно убедиться, что запущен только один экземпляр моего скрипта.
  15. Linux/Unix, чтобы определить, запущен ли процесс?
  16. ВЫ ДОЛЖНЫ знать ПИД-код!
  17. Как определить, работает ли процесс (pid)
  18. Вы должны знать PID вашего процесса.

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

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

Но я не получил никакого конкретного решения. Вот пример, который я попробовал: я создал abc.sh файл и запустил этот скрипт в фоновом режиме, например sh abc.sh & .

Теперь этот файл работает в фоновом режиме, и я запускаю ps aux | grep «abc» команду.

Ниже приведен вывод этой команды:

После этого я останавливаю abc.sh запущенный скрипт и запускаю ту же ps aux | grep «abc» команду.

Но я получаю такой же вывод, как:

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

Каждый процесс будет указан в выводе ps aux ; будь то бег, сон, зомби или остановка.

Тем не менее, в вашем случае, поскольку вы запустили процесс с помощью sh abc.sh , sh это приложение (оболочка), которое работает, а не abc.sh . Следовательно, ps aux не будет содержать процесс, abc.sh из-за которого grep не может дать никакого результата.

Итак, правильный способ, которым вы должны были использовать это как:

Это также может вернуть вам другой процесс, который работает со строкой в sh любом месте их вывода ps aux .

Вы должны заметить, что процесс будет «запущен», когда на выходе ps aux будет свой STAT as R . Если это что-то отличное от этого, оно не запускается в том случае, если вы запустили команду для проверки запущенных процессов. Различные состояния процесса можно найти на странице руководства для ps:

Вы также можете запустить top команду, чтобы проверить, запущен ли процесс или находится в спящем режиме, а также количество ресурсов процессора и оперативной памяти, которые он потребляет. (Это снова перечислит ваш процесс как sh ).

Однако, если вы хотите, чтобы ваш процесс был указан как abc.sh , то у вас должна быть первая строка скрипта, который вы запускаете как:

чтобы оболочка знала, какое приложение использовать для запуска сценария (в данном случае sh, измените его #!/bin/bash на bash), а затем предоставьте исполняемые права доступа процессу, используя:

Источник

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

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

Но я не получил никакого конкретного решения. Вот пример, который я попробовал: я создал abc.sh файл и запустить этот скрипт на фоне, как sh abc.sh & ,

Теперь этот файл работает в фоновом режиме, и я запускаю ps aux | grep «abc» команда.

Ниже приведен вывод этой команды:

После этого я прекращаю abc.sh запустить скрипт и запустить одну и ту же команду ps aux | grep «abc» команда.

Но я получаю такой же вывод, как:

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

6 ответов

Каждый процесс будет указан в выводе ps aux ; будь то бег, сон, зомби или остановка.

Однако, в вашем случае, так как вы запустили процесс, используя sh abc.sh , sh это приложение (оболочка), которое работает, а не abc.sh , Следовательно, ps aux не будет содержать процесс abc.sh из-за которой grep не мог дать никакого результата.

Итак, правильный способ, которым вы должны были использовать это как:

Это также может вернуть вам другой процесс, который работает со строкой sh где-нибудь в их выводе ps aux ,

Вы должны отметить, что процесс будет «запущен», когда на выходе ps aux имеет свой STAT как R , Если это что-то отличное от этого, оно не запускается в том случае, если вы запустили команду для проверки запущенных процессов. Различные состояния процесса можно найти на странице руководства для ps:

Читайте также:  Windows remove window border

Вы могли бы также запустить top команда, чтобы проверить, запущен ли процесс или находится в спящем режиме, а также объем процессора, оперативной памяти, который он потребляет (Это снова перечислит ваш процесс как sh ).

Однако, если вы хотите, чтобы ваш процесс был указан как abc.sh , тогда у вас должна быть первая строка скрипта, который вы запускаете как:

чтобы оболочка знала, какое приложение использовать для запуска скрипта (в этом случае sh, измените его на #!/bin/bash для bash) и затем предоставьте исполняемые права доступа процессу, используя:

Источник

Как определить, запущен процесс или нет, и использовать его для создания условного сценария оболочки?

Как я могу определить, запущен процесс или нет, а затем выполнить сценарий bash для выполнения каких-либо действий на основе этого условия?

если процесс abc запущен, сделайте это

если это не работает, сделайте это.

Сценарий bash, выполняющий что-то подобное, будет выглядеть примерно так:

Этот скрипт просто проверяет, запущена ли программа «gedit».

Или вы можете только проверить, работает ли программа следующим образом:

Любое решение, которое использует что-то вроде ps aux | grep abc или pgrep abc имеет недостатки.

Почему?

Поскольку вы не проверяете, запущен ли конкретный процесс, вы проверяете, запущены ли какие-либо процессы, которые совпадают abc . Любой пользователь может легко создать и запустить исполняемый файл с именем abc (или содержащий abc его в своем имени или аргументах), что приведет к ложному срабатыванию вашего теста. Есть различные варианты , которые можно применить к ps , grep и pgrep сузить область поиска, но вы все равно не получите надежный тест.

Итак, как мне надежно протестировать определенный процесс?

Это зависит от того, для чего вам нужен тест.

Я хочу убедиться, что служба abc запущена, и если нет, запустите ее

Для этого и нужны init и upstart. Они запустят службу и гарантируют, что ее pid будет сохранен в pidfile. Попробуйте снова запустить службу (через init или upstart), и она проверит pid-файл и либо запустит его, если его там нет, либо прервет работу, если он уже запущен. Это все еще не на 100% надежно, но это так близко, как вы получите.

ABC это мой сценарий. Мне нужно убедиться, что запущен только один экземпляр моего скрипта.

В этом случае используйте файл блокировки или файл блокировки. Например

См. Bash FAQ 45 для других способов блокировки.

Это то, что я использую:

Говоря простым языком: если ‘pgrep’ возвращает 0, процесс выполняется, в противном случае это не так.

Источник

Как определить, запущен процесс или нет, и использовать его для создания условного сценария оболочки?

Пакет transcode связывает плагин стабилизатора изображения vid.stab. Их видео-демонстрация, безусловно, выглядит убедительно (если немного вызывать рвоту).

13 ответов

Я обнаружил, что принятый ответ @John Vrbanac не работает для меня, и что ответ @geirha не отвечает на первоначальный вопрос.

Решение Джона Врбанака не помогло проверить, запущен ли процесс PHP для меня или нет, я использую CentOS 7.

Ответ @ geirha только гарантирует, что экземпляр еще не запущен, прежде чем запускать другой. Это не был первоначальный вопрос, первоначальный вопрос состоял в том, чтобы проверить, запущен процесс или нет.

Вот что сработало для меня:

Скажем, у моего процесса была строка «Jane» в названии процесса. Это найдет, работает он или нет. Это работает для скриптов BASH и PHP.

По состоянию на 23 сентября 2016 года pgrep, по-видимому, требует опцию «-x» для работы сценария Муру.

Я попробовал и протестировал вышеуказанный скрипт на машине с Ubuntu 16.04.1. Наслаждайтесь!

Ни одно из «простых» решений не работало на меня, потому что двоичный файл, который я должен проверить, не установлен в масштабе всей системы, таким образом, я должен свериться с путем, который в свою очередь требует использования ps -ef | grep подход:

Опираясь на идею @ rommel-cid, вы можете использовать pidof с || (||) для запуска команды, если процесс не существует и & amp; & amp; запускать что-то, если процесс существует, создавая быстрое условное выражение if / then / else. Например, вот один с запущенным процессом (мой браузер Chrome, имя процесса которого «chrome») и один тест для процесса, который не существует. Я подавил стандартный вывод, используя 1> / dev / null, чтобы он не печатался:

Читайте также:  Driver missing windows 10 что

Первое, что пришло мне в голову по вашей проблеме:
ps aux | grep -i abc покажет детали процесса, если он запущен. Вы можете сопоставить количество строк или время, в течение которого он работает, и сравнить его с нулем или любой другой манипуляцией. Когда вы запустите вышеуказанную команду, она покажет вам по крайней мере одну строку вывода, то есть подробности о процессе, созданном командой grep. Так что позаботьтесь об этом.
Это должно быть простым взломом. Поместите его в скрипт bash и посмотрите, будет ли он полезным.

Это — то, что я использую:

Без обиняков: если ‘pgrep’ возвращается 0, процесс работает, иначе это не.

Связанное чтение:

Любое решение, использующее что-то вроде ps aux | grep abc или pgrep abc , имеет недостатки.

Почему?

Поскольку вы не проверяете, запущен ли конкретный процесс, вы проверяете, есть ли какие-либо запущенные процессы, которые, как оказалось, совпадают abc . Любой пользователь может легко создать и запустить исполняемый файл с именем abc (или содержащий где-то в своем имени или аргументах abc ), что приведет к ложному срабатыванию вашего теста. Существуют различные варианты, которые вы можете применить к ps , grep и pgrep , чтобы сузить поиск, но вы все равно не получите надежный тест.

Итак, как мне надежно проверить определенный запущенный процесс?

Это зависит от того, для чего вам нужен тест.

Я хочу убедиться, что служба abc запущена, а если нет, запустите ее

Для этого предназначены init и upstart. Они запустят службу и гарантируют, что ее pid будет сохранен в pidfile. Попробуйте снова запустить службу (через init или upstart), и она проверит pid-файл и либо запустит его, если его там нет, либо прервет работу, если он уже запущен. Это все еще не на 100% надежно, но это настолько близко, насколько это возможно.

abc — мой сценарий. Мне нужно убедиться, что запущен только один экземпляр моего скрипта.

В этом случае используйте файл блокировки или файл блокировки. Э.Г.

См. Bash FAQ 45 для других способов блокировки.

Источник

Linux/Unix, чтобы определить, запущен ли процесс?

Мне нужна независимая от платформы (Linux/Unix | OSX) оболочка /bash команда, которая определит, работает ли какой-либо конкретный процесс. например mysqld , httpd …
Каков самый простой способ/команда для этого?

Хотя pidof и pgrep являются отличными инструментами для определения того, что работает, они, к сожалению, недоступны в некоторых операционных системах. Определенным отказоустойчивым было бы следующее: ps cax | grep command

Выход на Gentoo Linux:

Выход на OS X:

В Linux и OS X grep возвращает код выхода, поэтому легко проверить, был ли найден процесс или нет:

Кроме того, если вам нужен список PID, вы можете легко grep для них:

Выходные данные в Linux и OS X одинаковы:

Вывод следующего представляет собой пустую строку, что делает этот подход безопасным для процессов, которые не выполняются:

Этот подход подходит для написания простого теста пустой строки, а затем итерации через обнаруженные PID.

Вы можете протестировать его, сохранив его в файле (с именем “running” ) с разрешениями на выполнение (chmod + x running) и выполнив его с помощью параметра: ./running «httpd»

ВНИМАНИЕ.

Пожалуйста, имейте в виду, что вы просто разбираете вывод ps ax , что означает, что, как видно на выходе Linux, это не просто сопоставление процессов, но и аргументы, переданные этой программе. Я настоятельно рекомендую быть максимально конкретным при использовании этого метода (например, ./running «mysql» также будет соответствовать процессам “mysqld” ). Я настоятельно рекомендую использовать which для проверки возможного полного пути.

Литература:

ВЫ ДОЛЖНЫ знать ПИД-код!

Поиск процесса путем попытки распознавания образов в аргументах процесса (например, pgrep «mysqld» ) – это стратегия, которая рано или поздно обречена на провал. Что делать, если у вас есть два mysqld? Забудьте о таком подходе. Вы МОЖЕТЕ исправить это временно, и МОЖЕТ РАБОТАть год или два, но потом что-то происходит, о чем вы не думали.

Идентификатор процесса (pid) действительно уникален.

Всегда сохраняйте pid, когда вы запускаете что-то в фоновом режиме. В Bash это можно сделать с помощью переменной $! Bash. Сделав это, вы сэкономите себя.

Как определить, работает ли процесс (pid)

Итак, теперь возникает вопрос, как узнать, работает ли pid.

Это POSIX и, следовательно, переносимый. Он вернет сам pid, если процесс запущен или ничего не возвращает, если процесс не запущен. Строго говоря, команда вернет один столбец pid , но так как мы указали на пустой заголовок заголовка (материал, непосредственно предшествующий знаку равенства), и это единственный запрашиваемый столбец, то команда ps не будет использовать заголовок вообще. Это то, что мы хотим, потому что оно упрощает синтаксический анализ.

Читайте также:  Tmac для windows 10

Это будет работать на Linux, BSD, Solaris и т.д.

Другая стратегия – проверить значение выхода из вышеприведенной команды ps . Он должен быть равен нулю, если процесс запущен и не равен нулю, если это не так. Спецификация POSIX говорит, что ps должен выйти > 0, если произошла ошибка, но мне непонятно, что представляет собой “ошибка”. Поэтому я лично не использую эту стратегию, хотя я уверен, что она будет работать и на всех платформах Unix/Linux.

В большинстве дистрибутивов Linux вы можете использовать pidof (8).

Он распечатает идентификаторы процессов всех запущенных экземпляров определенных процессов или ничего, если экземпляры не запущены.

Например, в моей системе (у меня есть четыре экземпляра bash и один экземпляр remmina ):

В других Unices, pgrep или комбинация ps и grep будут достигать того же, что и другие по праву отметили.

Это должно работать на большинстве вариантов Unix, BSD и Linux:

  • SunOS 5.10 [Следовательно, PATH=. ]
  • Linux 2.6.32 (CentOS)
  • Linux 3.0.0 (Ubuntu)
  • Дарвин 11.2.0
  • FreeBSD 9.0-STABLE
  • Red Hat Enterprise Linux ES release 4
  • Red Hat Enterprise Linux Server выпуска 5

Просто небольшое добавление: если вы добавите флаг -c в ps, вам не нужно будет удалять строку, содержащую процесс grep, с grep -v . То есть.

– это все, что вам нужно в системе bsd-ish (включая MacOSX). Вы можете оставить -u , если вам нужно меньше информации.

В системе, где генетика команды native ps указывает на SysV, вы должны использовать

для списка, содержащего больше, чем просто имя pid и process. Конечно, вы можете выбрать конкретные поля для печати с помощью параметра -o .

Самый простой способ – использовать ps и grep:

Если у вашей команды есть некоторые аргументы команды, вы также можете поместить больше “grep cmd_arg1” после “grep $command”, чтобы отфильтровать другие возможные процессы, которые вас не интересуют.

Пример: покажите мне, если какой-либо java-процесс с предоставленным аргументом:

Объединяя различные предложения, самая чистая версия, с которой я смог придумать (без ненадежного grep, который запускает части слов):

kill -0 не убивает процесс, но проверяет, существует ли он и возвращает true, если у вас нет pidof в вашей системе, сохраните pid при запуске процесса:

Я использую pgrep -l httpd , но не уверен, что он присутствует на любой платформе…
Кто может подтвердить на OSX?

Вы должны знать PID вашего процесса.

Когда вы запустите его, его PID будет записан в переменной $! . Сохраните этот PID в файл.

Затем вам нужно будет проверить, соответствует ли этот PID выполняемому процессу. Здесь полный скелет script:

На основе ответа peterh . Трюк для знания того, работает ли данный PID, находится в инструкции ps -o pid= -p $PID .

Этот подход может быть использован в случаях, когда команды “ps”, “pidof” и “rest” недоступны.
Я лично использую procfs очень часто в своих инструментах/сценариях/программах.

Маленькое объяснение, что происходит:

  • -m1 – остановить процесс при первом совпадении
  • “mysqld $| httpd $” – grep будет соответствовать строкам, которые закончились на mysqld ИЛИ httpd
  • /proc/6 * – bash будет соответствовать строке, которая начиналась с любого числа
  • cut – просто разделите результат на разделитель ‘/’ и поле для извлечения 3

Отправляет количество процессов, чье базовое имя – “хром-браузер”:

Если это печатает “0”, процесс не выполняется. Команда предполагает, что путь процесса не содержит разрывного пространства. Я не тестировал это с приостановленными процессами или процессами зомби.

Протестировано с использованием gwak в качестве альтернативы awk в Linux.

Вот более универсальное решение с некоторыми примерами использования:

Следующая функция оболочки, основанная только на стандартных командах и параметрах POSIX, должна работать на большинстве (если не на всех) Unix и Linux-системах.

Обратите внимание, что при передаче сомнительного имени команды “0” оно будет подавляться, а также не сможет идентифицировать процессы, имеющие встроенное пространство в их именах.

Отметим также, что для большинства приоритетных и принятых решений требуются не переносимые опции ps , и безвозмездно использует оболочку, которая, несмотря на свою популярность, не гарантируется на всех машинах Unix/Linux ( bash )

Источник

Оцените статью