Как узнать, открыта ли какая-либо программа

Используя командную строку в терминале, я хочу отобразить 1 если программа (например, Firefox или Chromium) открыта и 0 противном случае.

Edit: «open», я имею в виду «работает на текущем компьютере и имеет окно, открытое на X-сервере, который я вижу»

  • Можно ли использовать флаги -y и -Y для hdparm?
  • Каким образом можно извлечь сегмент из текстового файла?
  • Как список слов, разделенных пробелами, складывается в табличные столбцы, которые соответствуют ширине терминала
  • fg a bg, потому что вы забыли перенаправить вывод в / dev / null
  • Быстрый инструмент для создания миниатюрных видео галерей для командной строки
  • Файлы, затронутые командой
  • Как предотвратить экранирование экрана (черный) из командной строки
  • копирование файлов с определенными именами в другую папку
  • Как найти каждый файл, который содержит заданную функцию?
  • sed удалять пространство
  • Помещение Linux-процессов на определенные ядра ЦП
  • Отменить настройку раскладки клавиатуры
  • 3 Solutions collect form web for “Как узнать, открыта ли какая-либо программа”

     xwininfo -root -children | grep -q '"Firefox")' echo "$(($? == 0))" 

    Выпустил бы 1, если есть окно класса Firefox подключенное к вашему X-серверу (любым пользователем с любой машины).

    Чтобы ограничить процессы Firefox локальными машинами, на которых вы выполняете эту команду:

     xwininfo -root -children | awk '/"Firefox"\)/{print $1}' | xargs -I% xprop -id % WM_CLIENT_MACHINE | cut -d\" -f2 | grep -qFx "$(uname -n)" 

    Поиск по имени процесса не гарантирует, что процессы фактически отображают свое окно на вашем X-сервере.

    Описанный выше метод согласуется с тем, как firefox проверяет текущий запущенный firefox, когда он не передан --no-remote .

    pgrep -x chromium не будет соответствовать именам процессов, например chromium-foo , и > /dev/null может быть заменен на -q :

     pgrep -xq chromium; echo $(($? == 0)) 

    pgrep не определен POSIX, и, к примеру, он не был включен в OS X до недавнего времени. Но вы также можете использовать ps :

     ps -eo comm= | grep -xq chromium; echo $(($? == 0)) # GNU ps -eco comm= | grep -xq chromium; echo $(($? == 0)) # OS X ps -eo comm= | sed 's|.*/||' | grep -xq chromium; echo $(($? == 0)) # either 

    В OS X -o comm печатает абсолютные пути команд и -co comm prints basenames. В GNU -o comm печатает basenames и -c не определен.

    Существует несколько способов проверить, запущен ли процесс с определенным именем. Один из них – использовать pgrep а другой – использовать ps :

     pgrep "chromium" >/dev/null 2>&1 && echo 1 || echo 0 ps aux | grep "[c]hromium" >/dev/null 2>&1 && echo 1 || echo 0 grep "[c]hromium" <(ps aux) >/dev/null 2>&1 && echo 1 || echo 0 

    Команда pgrep ищет процессы на основе их имени и отображает PID любого процесса, который соответствует его аргументу. Здесь вместо его вывода используется возвращаемое значение pgrep (следовательно, перенаправление на /dev/null ), поэтому мы знаем, что что-то согласовано или нет. Команда grep также отображает совпадения с stdout поэтому ее также нужно перенаправить.

    Linux и Unix - лучшая ОС в мире.