Какова команда терминала Mac OS X для выхода из системы текущего пользователя?

19

Я хотел бы запустить что-то вроде «sleep 3600; logout», но команда logout bash только закрывает текущий терминал. Как закрыть полный сеанс Mac OS X?

Гжегож Адам Ханкевич
источник

Ответы:

22

Следующий Applescript выйдет из текущего пользователя:

tell application "System Events" to log out

Вы можете заключить это в псевдоним bash, используя osascriptкоманду:

alias maclogout="osascript -e 'tell application \"System Events\" to log out'"

Это то же самое, что нажать «> Выйти [имя пользователя] ...» и выйти из системы через 2 минуты ожидания.

Это легко сочетается с sleepкомандой:

alias delayedlogout="sleep 3600; maclogout"

..или можно объединить в один псевдоним:

alias delayedlogout="sleep 3600; osascript -e 'tell application \"System Events\" to log out'"
DBR
источник
Хорошо сказано. Улучшение, позволяющее точно ответить на этот вопрос, заключалось бы в том, чтобы включить синтаксис «сна» в appleScript. Кроме того, я понимаю, что вторая строка кода была вставлена ​​из терминала, но поэтому она без необходимости избегала двойных кавычек вокруг системных событий.
Жертвоприношение
@ Жуткая хорошая мысль о команде сна. alias maclogout="..."
Требуется
2
Недавно я обнаружил, что выполнение команды в терминале не приведет к выключению / закрытию системы из-за того, что сам терминал предотвращает выход из системы из-за того, что bash не является текущим процессом. Это легко исправить, выполнив '(sleep 1; command) &', где sleep ставит задачу в фоновом режиме и к тому времени, когда он выполняется, терминал не думает, что он занят.
Гжегож Адам Ханкевич
17

Не существует «хорошего» способа выхода текущего пользователя из терминала в OS X. «Грязный» способ сделать это - убить loginwindowпроцесс этого пользователя . Это грубо уничтожит все процессы (программы), работающие под вашим именем пользователя.

Это двухэтапный процесс.

  1. В терминале запустите это:

    ps -Ajc | grep loginwindow
    
  2. Затем запустите

    sudo kill <pid>
    

    Где <pid>находится первое число (второй столбец) из выходных данных вышеуказанной команды.

Используйте sudo kill -9, чтобы принудительно завершить процесс, который мне пришлось сделать, чтобы заставить это работать.

Так, например, когда вывод первой команды:

joshhunt    41     1    41 5e15c08    0 Ss     ??    3:13.09 loginwindow

Затем я запускал sudo kill 41, вводил свой пароль, и затем я выходил из системы.

Это может быть объединено в псевдоним bash:

alias messylogout="ps -Ajc | grep loginwindow | grep -v grep | awk '{print \$2}' | sudo xargs kill"
Джош Хант
источник
Не могли бы вы просто использовать sudo killall loginwindow? По крайней мере, на 10.7 loginwindowпроцесс, кажется, сразу же открывается снова.
Lri
3

Я знаю, что это старый вопрос, но он помог мне, команда, которая мне нужна на OS X 10.8:

ps -Ajc | grep loginwindow | awk '{print $2}' | sudo xargs kill -9

Оператор awkотличается и kill -9обеспечивает отображение приглашения на вход.

знак л
источник
@gronostaj Вы действительно верите, что такие изменения будут приняты? Я вижу предлагаемые правки, такие как отклоненные как «недействительные правки (попытка ответить или прокомментировать существующее сообщение)» или «радикальное изменение» все время - и у markl, очевидно, еще недостаточно представителей, чтобы публиковать комментарии.
Скотт
@ Скотт, ты прав, я слишком быстро опубликовал этот комментарий.
Гроностай
2

Я думаю, что нашел ответ на то, как изящно выйти из Mac OS X без 2-минутного ожидания.

Я понял, что, удерживая Shift, Option и Command и нажимая «q», вы выйдете изящно и не спросите «хотите ли вы выйти из системы».

Итак, я написал AppleScript через Automator для:

tell application "System Events"
     keystroke "q" using {command down, shift down, option down}
end tell
Bitec
источник
0

Если вы вошли в оболочку как тот же пользователь, который вошел в графический интерфейс Mac, вы можете выполнить команду sudo-less: launchctl reboot logoutкоторая довольно эффективно выходит из системы; у него есть предостережение о том, что приложения, которые закрываются, не запрашивают взаимодействие во время выхода, однако это не означает, что это то же самое, что убить их напрямую, как kill(SIG TERM) или kill -9(SIG KILL).

dlamblin
источник
0

Я бы сказал, что самый приятный способ опубликовать OS X 10.9 launchctl gui/$(id -u <username>) bootout

Документация post OS X 10.9 для launchctl обнаруживается при запуске launchctl help, но, по сути, приведенная выше команда прервет временную сессию пользователя. Альтернатива launchctl user/$(id -u <username>) bootoutразрушает постоянный сеанс, который запускает демоны пользователя, пока пользователь не вошел в систему.

Это можно проверить, запустив launchctl gui/$(id -u) bootout, сразу же выйдет из системы и заставит систему отобразить окно входа в систему (с некоторой задержкой).

Иэн Хендерсон
источник
По крайней мере, в El Capitan, правильная команда - это sudo launchctl bootout gui/XXXгде XXXчисловой идентификатор пользователя (UID). Обратите внимание, что i) bootoutподкоманда находится на первом месте, а ii) $(id)возвращает намного больше, чем UID.
Ларикс Децидуа
Обновлен для правильного вызова id (id -u)
Иэн Хендерсон
0

Хорошей утилитой для добавления в ваш терминал является команда выхода из системы , которая будет использоваться следующим образом:

logout UserName

Вот как:

  1. Отредактируйте ваш .bash_profile

    nano ~/.bash_profile

  2. Добавьте эту строку:

    logout() {sudo launchctl bootout user/$(id -u "$1")}

  3. Сохраните файл нажатием ctrl+x

  4. Перезагрузите терминал

Вы готовы к работе;)

Kappe
источник