Tengo un servidor que normalmente está apagado por razones de seguridad. Cuando quiero trabajar en él, lo enciendo, ejecuto mis tareas y lo apago nuevamente. Mis tareas generalmente no toman más de 15 minutos. Me gustaría implementar un mecanismo para apagarlo automáticamente después de 60 minutos.
He investigado cómo hacer esto con cron, pero no creo que sea la forma correcta porque cron no tiene en cuenta cuándo se encendió el servidor por última vez. Solo puedo establecer patrones periódicos, pero no tienen en cuenta esos datos.
¿Cómo podría hacer esta implementación?

at(ejecución única).sudo shutdown -h +60que iniciaría un contador de 60 minutos para el proceso de apagado (-halt). Si desea cancelarlo, podríasudo shutdown -c(aunque esto no usa cron)Respuestas:
Si ejecuta sus tareas como el mismo usuario cada vez, simplemente puede agregar el comando de apagado, opcionalmente con la opción -P, a su perfil. El número representa la cantidad de minutos que se demora el comando de apagado. Asegúrese de que su usuario tenga la capacidad de ejecutar el comando de apagado a través de sudo sin una contraseña.
fuente
shutdown -k -P 3600vsshutdown -k -P 60(-kimprime el mensaje del muro pero no tiene otro efecto)Hay varias opciones.
Proporcione tiempo directamente a
shutdown -P:Tenga en cuenta que la
shutdownpágina del manual también señala:Usa el
atcomando.Cree un archivo de unidad systemd o un script de inicio que se ejecute
shutdown -P 60al inicio.Use cron
@rebootpara ejecutar el comando después del arranque.Agregar a crontab (raíz):
Para los dos últimos métodos, también puede usar en
sleep 3600 && shutdown -P nowlugar de usar el argumento de tiemposhutdownpara retrasar el apagado por 60 minutos. De esta manera, los inicios de sesión son posibles hasta el último momento antes de que se emita el apagado.fuente
sleepcomando, aún necesita especificar un tiempo parashutdown- nos gustaría usarnowpara ese argumento si ya hemos hecho la espera (pero tenga en cuenta que no recibirá muchas advertencias para guardar su trabajo antes desaparece debajo de ti!).shutdown -P 60funciona, no es la forma en que se debe invocar el comando. De acuerdo con la página del manual que debe usarshutdown -P +60. --- También el apagado sin un argumento de tiempo (en el ejemplosleep 3600 && shutdown -P) se retrasará un minuto (comoshutdown -P +1). Como escribió Toby Speight, probablemente querrás usarloshutdown -P now.Esto parece un problema XY .
Si se apaga después de 60 minutos, corre el riesgo de que esté teniendo un problema particularmente complicado y solo necesite más tiempo. Muchas de las soluciones anteriores no facilitarían el retraso del cierre.
Si la tarea no es una tarea interactiva, sino que es una tarea programada que se activa automáticamente desde otra máquina, @sdkks dio una gran solución para eso; Realmente deberías asignarle a la máquina que se apague tan pronto como finalice el script y todas sus tareas.
Sin embargo, si su tarea es interactiva, le sugiero que haga una detección inactiva.
Si realiza su tarea en una GUI (X11), puede detectar las sesiones de GUI inactivas utilizando el enfoque descrito aquí: ejecute un comando cuando el sistema esté inactivo y cuando esté activo nuevamente
Si realiza la tarea a través de un terminal, puede detectar usuarios conectados con el
whocomando. Puede configurar un cronjob que apaga la máquina siwhodevuelve un resultado vacío. Tenga en cuenta que este será un enfoque bastante conservador; no apagará el sistema si dejó la consola conectada, pero inactiva.Si desea ser un poco más agresivo y desconectar también las sesiones de terminal inactivas, puede combinar el enfoque anterior con desconectar automáticamente las sesiones SSH inactivas
ClientAliveIntervalyClientAliveCountMax. Otro enfoque para esto si no tiene SSH, pero tiene una sesión de terminal local, es usar el tiempo de inactividad del terminal tal como lo devuelve elwcomando.fuente
Aunque las respuestas anteriores aquí satisfacen el requisito de perfección, también puede apagar la máquina tan pronto como se realicen las tareas.
bashlos scripts pueden sertrapped, lo que significa que ciertas señales pueden ser interceptadas y ciertas tareas pueden ejecutarse cuando sea necesario.EXITEs una de las señales que pueden quedar atrapadas.Podrías:
trapparaEXITsus scripts de shell automatizados, lo que significa la finalización de sus tareas automatizadastrappara su.bashrcEXIT, lo que significa que cada vez que cierre sesión en esa máquina, apáguela.La opción n. ° 1 sería el caso ideal, siempre que sus tareas no requieran inspección ad hoc y juicio manual.
La opción n. ° 2 cubriría los casos en los que olvidaría salir del terminal sin apagarlo. Sin embargo, hay una advertencia; Si tiene varias terminales abiertas para la misma máquina y sale de una de ellas, igual apagará la máquina. (Se puede programar para evitar eso, pero no complicaré la solución).
Esto puede ser al final de la
.bashrcopción # 2, en algún lugar en la parte superior de su script para la opción # 1.¿Por qué no usar
poweroffal final del guión?Prefiero usar
set -eo pipefailen la parte superior de mis scripts. Si ocurre algún error, no fallará en silencio; dejará de ejecutar más comandos.trapdeEXITseñal debe cubrir los casos en que el script termina prematuramente debido a errores.Sin embargo, para sus tareas, esto también puede significar que la máquina se apagará antes de que se complete.
Tengo una
bashplantilla simple que uso para facilitar la depuración de scripts; tal vez podría ser de alguna utilidad. Por favor vea esta esencia .fuente
.bashrcpreferiría el fondo en caso de que algo más lo sobrescriba. Su preocupación no parece clara, ¿puede compartir un fragmento de ejemplo en repl.it quizás?Abundando en @dirkt comentario, se puede insertar un
atcomando en su.bashrco.profileo cualquier archivo que usa su shell en inicio de sesión para programar un apagado automático de 60 minutos después de su inicio de sesión.Algo como:
fuente
atel callejón. También puede veratlas tareas en/var/spool/aten este contexto porque sobrevive los reinicios. Si OP iniciara sesión, apagara manualmente y luego volviera a iniciar sesión en el lapso de una hora, sería expulsado antes de que transcurriera una hora después de su último inicio de sesión cuando el primer proceso de apagado programado.Lo siguiente se ejecuta
commandcon parámetros, y si se completa con éxito, se apagará la casilla de inmediato, suponiendo que el usuario pueda ejecutarpoweroff. Puede que necesite usarsudo poweroff.Mientras que el siguiente simplemente se ejecuta
poweroffinmediatamente cuando termina el comando:Si cree que el comando necesita tiempo de descanso después de la finalización, ejecute
Si cree que el comando podría ejecutar horas extras, puede restringirlo a una hora:
timeoutes parte delcoreutilspaquete, por lo que probablemente ya lo tenga.fuente
Si realmente le preocupa la seguridad, use un temporizador de salida mecánica en la fuente de alimentación. Simplemente configúrelo a la hora que desee que se apague. De esta manera, nadie puede iniciar sesión de forma remota y desactivar el apagado. Necesitarías acceso físico.
fuente
Si está en una
systemdmáquina, puede usar un temporizador monótonoLa unidad de temporizador
/etc/systemd/system/shutdown_after_an_hour.timerLa unidad de temporizador
/etc/systemd/system/shutdown_after_an_hour.service:Se habilita a través de
Su estado (en particular, cuánto tiempo queda antes del apagado) está disponible a través de
Funcionará en el próximo reinicio, no es útil
systemctl startdurante la sesión cuando se crea, ya que no funcionará (porque no se activó durante el reinicio) o apagará la máquina de inmediato si ha pasado una hora. No sé cuál sucederá de hecho, nunca he probado ese caso específico.fuente
Intente colocar el script (
sudo shutdown -P 3600) en el/etc/init.ddirectorio para ejecutarlo automáticamente al inicio.O intente usar
anacron, agregando el comando en el/etc/anacrontabarchivo. También sugiero usarnohupdelante del comando para asegurarse de que el comando aún funciona después de cerrar sesión.fuente
Aproveche el archivo de cierre de sesión de su Shell
Si solo necesita el servidor para tareas interactivas o no interactivas iniciadas por su UID, considere colocar sus comandos de apagado en su archivo ~ / .bash_logout . El manual de GNU Bash dice:
Por lo tanto, agregar "sudo poweroff" o similar a su archivo de cierre de sesión apagará el servidor tan pronto como cierre la sesión de su sesión actual, o cuando llame una sesión Bash no interactiva
exit. También podría optar por utilizar en o pasar un tiempo de retardo de apagado , si usted prefiere aplazar el cierre.Para un enfoque más interactivo de esto, puede poner los siguientes Bashisms en su archivo de cierre de sesión:
Advertencias
Hay algunas advertencias que debe tener en cuenta sobre esta solución:
startxo similar.exit, puede experimentar paradas que no esperaba.NOPASSWDlos comandos de apagado, o si no ha llamadosudo -vantes de ejecutar su comando de apagado.En resumen, es posible que desee considerar si este enfoque satisface sus necesidades reales o si un enfoque completamente diferente, como monitorear la ausencia de usuarios conectados o alguna otra alternativa, es una mejor opción. Su kilometraje definitivamente variará.
fuente