Выйдите из Google Chrome из терминала

28

Есть ли способ заставить google-chromeвыйти из терминала, кроме использования killall google-chrome?
Я хотел бы иметь возможность закрыть его из сценария, не убивая его.

slybloty
источник
2
Что не так с kill?
Zoredache
1
@Zoredache То, что это приводит к другому поведению при выходе, и что Chrome использует несколько процессов, один из которых (песочница) - setuid root.
Жиль "ТАК - перестань быть злым"

Ответы:

12

Возможно, wmctrlможет быть какая-то помощь. Вы можете использовать -cопцию, которая изящно закрывает окно:

wmctrl -c chrome

Строка chromeсопоставляется с заголовками окон. Обратите внимание, что окно может не закрыться, если всплывет какое-то сообщение (например, если у вас открыто несколько вкладок).

Baldrick
источник
1
Этот вариант работает безупречно, но требует установки wmctrl.
Слыблоты
wmctrl не может закрыть системный трей "Chrome Apps". pkill -o chromeделает хотя.
Кен Шарп
26

Эта команда корректно выходит из дерева процессов Chrome во всех оконных менеджерах:

pkill --oldest chrome

или если вы предпочитаете:

/usr/bin/pkill --oldest --signal TERM -f chrome    

Детали:

  • изящно означает: избегать просмотра «Google Chrome не закрылся правильно. Чтобы отплатить ... »в следующий раз запускается Chrome
  • браузер Chrome (например, версия 39.0.2171.95) ловит и изящно обрабатывает SIGTERM
  • сигнализировать об одном процессе, корне дерева процессов Chrome, следовательно --oldest
  • SIGTERMто же самое 15, что --signal TERMи SIGTERMсигнал
  • wmctrl работает с Unity и некоторыми другими, но работает не со всеми оконными менеджерами
  • wmctrl -c закрывает одно окно за раз, поэтому чтобы закрыть все хромированные окна, вам нужно что-то вроде while wmctrl -c 'Google Chrome'; do sleep 0.2; done
Кит Кассио
источник
1
Я предполагаю, что я использую старую версию pkill, поскольку --oldestэто не вариант: использование -oработает.
Кен Шарп
-fаргумент pkill не работает для меня. У меня есть некоторые другие процессы, работающие от имени пользователя root, в которых есть слово chrome в командной строке, поэтому мне просто отказано в разрешении. Без -f, это работает отлично, хотя.
Брайан Минтон
Это по-прежнему заставляет меня видеть, что «не закрыли все подряд»
xtrinch
В Ubuntu 18.04 как я могу сделать так, чтобы это выполнялось сразу после запуска перезапуска или завершения работы?
Хайме Хаблутцель
1

Это работает для меня:

killall --quiet --signal 15 -- chrome

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

killall -q -15 chrome
Fleshgrinder
источник
1

На Mac OS X, используйте это вместо

pkill -a -i "Google Chrome"

Что он делает, так это ищет процесс Google Chrome, а также уничтожает все его родительские процессы.

Из руководства pkill

    -a          Include process ancestors in the match list.  By default, the
                current pgrep or pkill process and all of its ancestors are
                excluded (unless -v is used).
    -i          Ignore case distinctions in both the process table and the
                supplied pattern.

В соответствии с @ Кейтом-Кассио 's ответа , вы можете попытаться убить сам старый процесс вместо. Обратите внимание, что это не сработало для меня.

pkill -o -i "Google Chrome"
hanxue
источник
0

пытаться:

kill -3 <pid_of_chrome>

Это отправит сигнал «ВЫЙТИ» в chrome, который, в зависимости от вашего оконного менеджера, будет тем, что обычно отправляется при запросе на закрытие.

Blackle Mori
источник
2
Это действует так же, как killи killallкогда Chrome видит это как сбой, и просит восстановить.
Слыблоты
1
попробуйте 15 вместо 3, затем
Blackle Mori
6
На самом деле, SIGQUITобычно не отправляется приложениям, когда их просят закрыть (я не знаю ни одного WM, который делает это). WM_DELETE_WINDOWэто стандарт.
Крис Даун
2
@ blacklemon67 kill -15 <pid_of_chrome>сделал то, что я искал. Но, google-chromeесть несколько пидов, и потребовалось несколько попыток, чтобы действительно получить правильный.
Слыблоты