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 +60
que 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 3600
vsshutdown -k -P 60
(-k
imprime el mensaje del muro pero no tiene otro efecto)Hay varias opciones.
Proporcione tiempo directamente a
shutdown -P
:Tenga en cuenta que la
shutdown
página del manual también señala:Usa el
at
comando.Cree un archivo de unidad systemd o un script de inicio que se ejecute
shutdown -P 60
al inicio.Use cron
@reboot
para 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 now
lugar de usar el argumento de tiemposhutdown
para 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
sleep
comando, aún necesita especificar un tiempo parashutdown
- nos gustaría usarnow
para 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 60
funciona, 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
who
comando. Puede configurar un cronjob que apaga la máquina siwho
devuelve 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
ClientAliveInterval
yClientAliveCountMax
. 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 elw
comando.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.
bash
los scripts pueden sertrap
ped, lo que significa que ciertas señales pueden ser interceptadas y ciertas tareas pueden ejecutarse cuando sea necesario.EXIT
Es una de las señales que pueden quedar atrapadas.Podrías:
trap
paraEXIT
sus scripts de shell automatizados, lo que significa la finalización de sus tareas automatizadastrap
para su.bashrc
EXIT
, 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
.bashrc
opción # 2, en algún lugar en la parte superior de su script para la opción # 1.¿Por qué no usar
poweroff
al final del guión?Prefiero usar
set -eo pipefail
en la parte superior de mis scripts. Si ocurre algún error, no fallará en silencio; dejará de ejecutar más comandos.trap
deEXIT
señ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
bash
plantilla simple que uso para facilitar la depuración de scripts; tal vez podría ser de alguna utilidad. Por favor vea esta esencia .fuente
.bashrc
preferirí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
at
comando en su.bashrc
o.profile
o 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
at
el callejón. También puede verat
las tareas en/var/spool/
at
en 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
command
con 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
poweroff
inmediatamente 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:
timeout
es parte delcoreutils
paquete, 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
systemd
máquina, puede usar un temporizador monótonoLa unidad de temporizador
/etc/systemd/system/shutdown_after_an_hour.timer
La 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 start
durante 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.d
directorio para ejecutarlo automáticamente al inicio.O intente usar
anacron
, agregando el comando en el/etc/anacrontab
archivo. También sugiero usarnohup
delante 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:
startx
o similar.exit
, puede experimentar paradas que no esperaba.NOPASSWD
los comandos de apagado, o si no ha llamadosudo -v
antes 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