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

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

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

  • Centos7 на NUC приостанавливается при нажатии кнопки питания
  • Как я могу генерировать изображения CMYK через командную строку под Linux?
  • ssh -X foo @ host, затем su bar, а затем запустите приложение X с локальным дисплеем, в то время как бар также войдет в систему?
  • OpenWrt (Chaos Calmer 15.05.1): `opkg install <package> -d ram` не работает
  • «Текущее» окно терминала на команду shell / executable?
  • Установка пакета
  • Как pkg выбирает свои репозитории (FreeBSD 10)
  • Ctrl-C с двумя одновременными командами в bash
  • 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 - лучшая ОС в мире.