¿Usar el comando de terminal para apagar, reiniciar y suspender mi Mac?

Cada vez estoy más interesado en usar Terminal como una forma alternativa de abordar soluciones en mi Mac. He visto esta pregunta titulada "¿Hay una mejor manera de apagar/reiniciar OSX?" .

Por eso quisiera saber:

¿Cómo apagar, reiniciar y dormir mi Mac usando el comando Terminal exclusivamente?

reiniciar para reiniciar también funciona.

Respuestas (4)

El comando que buscas es shutdown . Esto informa a todos los usuarios que la máquina se apagará y les dice a todas las aplicaciones que cierren archivos, etc.

El comando toma un parámetro -h, -ro -spara apagar, reiniciar o suspender la Mac.

El comando debe ejecutarse como root, por lo que debe usar sudo.

por ejemplo, para reiniciar la máquina inmediatamente

sudo shutdown -r now

por ejemplo, para apagar la máquina en 60 minutos

sudo shutdown -h +60

De los comentarios hay dos cosas que deben abordarse.

La forma en que funciona el apagado es enviando un sigterm a todos los procesos que luego deberían lidiar con eso, por ejemplo, guardar archivos abiertos, etc. Si no salen, se les enviará un SIGKILL que los obliga a morir sin posibilidad de responder. Las señales no se envían a través de la cola de mensajes clave normal, por lo que las aplicaciones tienen que lidiar con esto por separado del código que se llama desde salir en el menú. Una buena aplicación debería llamar al código común de ambos.

Esta otra respuesta muestra cómo apagar como si presionaras las opciones del menú. Pero tenga en cuenta que las aplicaciones pueden cancelar este cierre

Tal vez un poco sin relación con la pregunta y esta respuesta, pero por lo que vale, esto también me resulta útil para bloquear mi Mac desde la Terminal, algo así como presionar Winkey + L en Windows: /System/Library/CoreServices/Menu\ Extras/User.menu/Contents/Resources/CGSession -suspend. Lo tengo con alias en un archivo que se origina en mi .bash_profile de la siguiente manera:alias lock='/System/Library/CoreServices/Menu\ Extras/User.menu/Contents/Resources/CGSession -suspend'
¿Realmente "le dice a todas las aplicaciones que cierren archivos, etc."? ¿Pensé que acababa de matarlo todo? La página de manual es de 1998 BSD: ¿Apple actualizó el comando para hablar bien con el software macOS? Útil si las cosas se han colgado, pero si el sistema funciona bien, parece que decirle al proceso de la ventana de inicio de sesión que haga el trabajo sería más "cortés".
@j-beda Consulte el documento de Apple developer.apple.com/legacy/library/documentation/Darwin/… - Primero envía un SIGTERM con el que deben lidiar las aplicaciones antes de recibir un SIGKILL. Vea la otra respuesta para hacerlo a través de la ventana de inicio de sesión/GUI En realidad, ¿cómo haría la ventana de inicio de sesión?
Estoy bastante seguro de que el "apagado" de Unix no hace todas las cosas que hace el proceso normal de apagado de la GUI de Mac, por lo tanto, en la medida en que Apple no lo usa en su propio software directamente, pero como mínimo hace algunas cosas antes de invocar ello, hay algunas desventajas en invocarlo directamente. Creo que la aplicación "ventana de inicio de sesión" está disponible incluso cuando no está en la ventana de inicio de sesión de la GUI, y se puede invocar a través de la herramienta "osascript" de la línea de comandos. Sin embargo, no es infalible, por lo que es posible que deba invocar el "apagado" de todos modos (o enviar muertes individuales a procesos específicos, supongo).
El mecanismo de la señal no coloca un mensaje en la cola de mensajes de las aplicaciones como lo hace un cierre normal, pero las aplicaciones aún deben manejarlo. es decir, si no funciona correctamente, es culpa de las aplicaciones. para algún intento de GUI, vea la otra respuesta. Pero descubrí que a menudo hay una aplicación que se niega a morir y cancela el proceso de cierre, por lo que el apagado es la única forma segura.
Cuando usa este comando, no parece salir de las aplicaciones GUI. Leí todos los comentarios que envían las señales que deberían hacer que se cierren rápidamente con gracia, pero lo que VES cuando ejecutas este comando es que toda la GUI desaparece instantáneamente. Me pone nervioso usar este comando.
@ l008com sí, eso es cierto. El comando no envía a cada aplicación el equivalente de la opción del menú de salida, pero envía a cada proceso, no solo a las aplicaciones, una señal con la que debe lidiar la aplicación. Pero creo que tiene razón al sospechar que muchos apss no se ocupan de esto. Pero, de nuevo, es mejor que la Mac muera cada mes o dos. Sospecho un corte de energía. Así que suponga que su máquina fallará en cualquier momento

Apagar sin mostrar un cuadro de diálogo de confirmación:

osascript -e 'tell app "System Events" to shut down'

Apagar después de mostrar un cuadro de diálogo de confirmación:

osascript -e 'tell app "loginwindow" to «event aevtrsdn»'

Reinicie sin mostrar un cuadro de diálogo de confirmación:

osascript -e 'tell app "System Events" to restart'

Reinicie después de mostrar un cuadro de diálogo de confirmación:

osascript -e 'tell app "loginwindow" to «event aevtrrst»'

Cerrar sesión sin mostrar un cuadro de diálogo de confirmación:

osascript -e 'tell app "System Events" to  «event aevtrlgo»'

Cerrar sesión después de mostrar un cuadro de diálogo de confirmación:

osascript -e 'tell app "System Events" to log out'

Ir a dormir ( pmset):

pmset sleepnow

Ir a dormir (AppleScript):

osascript -e 'tell app "System Events" to sleep'

Ponga las pantallas en modo de suspensión (10.9 y posterior):

pmset displaysleepnow

Los códigos de cuatro letras para los eventos de Apple se enumeran en AERegistry.h.

Todos los comandos de eventos del sistema anteriores envían eventos de Apple al loginwindowproceso. loginwindowse envían los mismos eventos de Apple que los anteriores cuando cierras la sesión, reinicias, apagas o pones la Mac en suspensión normalmente. Consulte las preguntas y respuestas técnicas QA1134: Provocar el reinicio, el apagado o el cierre de sesión mediante programación .

Según man shutdown, shutdown -h nowy shutdown -r nowenvía procesa una TERMseñal seguida de una KILLseñal.

De acuerdo con la Guía de programación de demonios y servicios , cuando le indica loginwindowque cierre la sesión, los procesos que admiten la terminación repentina reciben una KILLseñal y los procesos que no admiten la terminación repentina se terminan de diferentes maneras: las aplicaciones Cocoa reciben el applicationShouldTerminate:método de delegado, las aplicaciones en primer plano reciben el kAEQuitApplicationevento de Apple, las aplicaciones en segundo plano reciben el kAEQuitApplicationevento de Apple seguido de una KILLseñal y los demonios reciben una TERMseñal seguida de una KILLseñal después de unos segundos.

¿Qué hay de cerrar con applescript después de un tiempo de espera? Supongo que sleep 60 && osascript -e 'tell app "System Events" to shut down'podría funcionar, pero ¿cómo hacerlo solo con AppleScript?
Así que intenté usar la técnica AppleScript para hacer un reinicio suave con guión. El problema es que si los usuarios de intercambio de archivos están conectados a la máquina, no se reiniciará. Arroja un mensaje de "hay usuarios conectados...", uno que NO tiene un temporizador incorporado. Entonces, ¿hay alguna manera de volcar primero a todos los usuarios que comparten archivos, antes de ejecutar este comando?

Apagar inmediatamente:

sudo shutdown -h now

Si tiene ganas de retrasar el apagado, puede usar la siguiente sintaxis de comando en su lugar:

sudo shutdown -h +30

(-h parámetro establece el tiempo para apagar, donde (+) 30 minutos para detener el sistema)

La información presentada en su respuesta ya está incluida en la respuesta aceptada y, como tal, no es necesario repetir lo que ya se mencionó y aceptó.
@ user3439894 No, no lo es.

también útil, para cerrar la sesión desde el indicador de línea de comandos de la terminal, escriba 'salir':

[host:~user]$ exit
¿De qué manera esto apaga, reinicia o suspende la Mac?