Ejecute el comando antes de apagar / reiniciar [duplicar]

19

Tengo una máquina que ejecuta un par de máquinas virtuales vagabundos. El problema que tengo es que a veces me olvido de apagar esas máquinas virtuales antes de apagar o reiniciar mi máquina. Por eso mi máquina se atasca con este mensaje:waiting for vboxnet0 to become free

Busqué soluciones y encontré esta página:

http://en.kioskea.net/faq/3348-ubuntu-executing-a-script-at-startup-and-shutdown

Intenté lo que para el cierre, pero no funciona.

Escribí un archivo sh para ese comando:

#!/bin/bash

cd ~/workspace/git/mediaservice
vagrant halt

¿alguna sugerencia?

SERPRO
fuente
44
El método en el enlace es válido y funciona en todas las versiones de Linux, por lo que su secuencia de comandos es incorrecta;) El usuario no se conoce al cerrar, ya que lo hace el usuario root. Así que suelte el "~" y conviértalo en un camino completo.
Rinzwind
¿Funciona? Seguí un manual similar como gist.github.com/ymc-geha/8416723 pero no funcionó para mí en ubuntu 14.04
user2135804
@ user2135804 Pensé que sí ... pero en realidad no funcionó para Vagrant ... Intenté con otras cosas y funcionó bien.
SERPRO
1
Por cierto, el error que estás describiendo está aquí .
Garrett
1
Como se ve en el informe de error, esto se ha solucionado y se incluirá con VirtualBox 4.3.29.
Garrett

Respuestas:

12

Si sus máquinas virtuales vagabundos están usando VirtualBox, puede modificar / etc / default / virtualbox y cambiar la línea que dice:

SHUTDOWN_USERS=""

a

SHUTDOWN_USERS="all"

Eso me lo arregló en Ubuntu 14.04

GaryBishop
fuente
1
En realidad, hay un boleto abierto en la caja virtual conectado con esto. virtualbox.org/ticket/12264 . Sugeriría usar en SHUTDOWN_USERS=`cut -d: -f1 /etc/passwd`lugar deSHUTDOWN_USERS="all"
running.t el
También estoy en Ubuntu 14.04 con Vagrant usando VirtualBox, pero no tengo ningún /etc/default/virtualboxarchivo ...
Garrett
21

Para ejecutar un script al apagar o reiniciar:

  1. guarda tu script en /etc/rc6.d
  2. Hazlo ejecutable: sudo chmod +x K99_script

Notas:

  • El script en rc6.d debe ser sin extensión .sh
  • El nombre de su script debe comenzar con K99 para ejecutarse en el momento adecuado.
  • Los scripts en este directorio se ejecutan en orden alfabético.

fuente

Maythux
fuente
1
En efecto. Es muy importante nombrarlo correctamente para que se ejecute en el momento adecuado.
Shivams
2
Puse un script en /etc/rc6.d y no se ejecutó al apagar. Lo puse en /etc/rc0.d y se ejecutó al apagar. Probablemente, rc.6 es solo para reiniciar.
Erel Segal-Halevi
2
@Erel Segal-Halevi Intenté agregar un script K99 a /etc/rc6.d y no se ejecutó. Mirando los otros scripts, hay una línea ** negrita K10reboot -> ../init.d/reboot ** code, ¡así que parece que un script K99 NUNCA se ejecutará!
David Walker
La respuesta de Ravi a continuación es una mejor opción porque utiliza enlaces simbólicos para garantizar que el script se ejecute tanto en el apagado como en el reinicio. También creo que la mayoría de los archivos del sistema tienden a adoptar este enfoque.
Eddie
rc.6 parece ser solo para reiniciar como otros mencionaron. Ver
Aelian
12

Cómo hacerlo con Systemd (es más fácil)

Ahora que las variantes de Ubuntu y Mint se han movido a systemd, encontré que mis soluciones antiguas basadas en lo anterior son menos satisfactorias. Busqué en la web para averiguar cómo hacerlo con systemd y terminé combinando la sabiduría de otros y documentándolo como una publicación de blog en blogspot.com.au que contiene el siguiente tutorial.

Con systemd, crea uno o dos archivos para llamar a sus scripts utilizando las plantillas a continuación y ejecuta un par de comandos. Sencillo.


Versión GUI

Primero cree los scripts que desea ejecutar al inicio y / o apagado. Solo haz uno si no necesitas ambos. Creé .scopening_atstart y .scfullcopy_atend.

Luego, asegúrese de que ambos sean ejecutables haciendo clic con el botón derecho en el archivo, seleccionando propiedades y asegurándose de que, bajo permisos, haya marcado Permitir ejecutar el archivo como un programa.

ingrese la descripción de la imagen aquí

Los dos archivos que creé se completan y guardan el contenido de un disco RAM. También crean un archivo en mi directorio de inicio para probar que el servicio está funcionando. Eran de la forma:

#!/bin/sh
cp -pru /home/john/zRamdisk/subdirectory1/* /home/john/.wine/drive_c/subdirectory1/
rm /home/john/stop_time
date +%D' '%T > /home/john/stop_time

Luego abrí mi administrador de archivos como root, abrí /etc/systemd/systemy creé un archivo startup.service y un archivo save-ramdisk.service. Obviamente, puede elegir sus propios nombres y los nombres genéricos podrían haber incluido un archivo de inicio llamado johns_start.service y un archivo de apagado llamado johns_shutdown.service. Simplemente no elija nombres de servicios existentes.

[Unit]
Description=Startup Applications

[Service]
Type=oneshot
RemainAfterExit=false
ExecStart=/home/john/.scopening_atstart

[Install]
WantedBy=multi-user.target

y

[Unit]
Description=Save Ramdisk to Wine drive C

[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/bin/true
ExecStop=/home/john/.scfullcopy_atend

[Install]
WantedBy=multi-user.target

Puede usar los mismos archivos de servicio, sustituyendo la ruta completa de su script ejecutable por la mía.

Finalmente, para cada uno, ejecute el comando systemctl enable your_files_name (pero sin el servicio de sufijo). Entonces mi primero fuesystemctl enable startup

Reinicie la computadora una vez para iniciar los servicios. El servicio de inicio se ejecutará siempre que systemd entre en el objetivo multiusuario y el servicio de detención cuando salga del objetivo multiusuario. Los archivos de servicio alternativos con diferentes condiciones de activación se describirán a continuación.

Los comandos adicionales útiles incluyen:

inicio
systemctl está habilitado inicio systemctl está activo inicio
systemctl reinicio inicio

Más se puede encontrar en la referencia anterior.



Versión CLI (línea de comando)

Esta descripción asume que usted opera desde su directorio personal en lugar de / home / john, usa sudo según sea necesario y su elección de editor donde escribo vim o svim.

Crea scripts de shell de inicio y apagado con la primera línea #!/bin/shy hazlos ejecutables usando chmod +x my_new_filename.

Cree dos archivos como el anterior, o en este ejemplo, un archivo para manejar las tareas de inicio y apagado. Ejecutaré scripts en mi directorio de inicio, pero @don_crissti muestra algunas alternativas en Stack Exchange .

svim /etc/systemd/system/start_and_stop.service

y copie en el contenido del archivo:

[Unit]
Description=Run Scripts at Start and Stop

[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/home/john/.startup_commands  #your paths and filenames
ExecStop=/home/john/.shutdown_commands

[Install]
WantedBy=multi-user.target

Luego habilite el servicio con el comando:

systemctl enable start_and_stop

y reinicie su sistema después de lo cual los servicios estarán activos. Los comandos systemctl is-enabled start_and_stopy systemctl is-active start_and_stopse pueden utilizar para monitorear sus nuevos servicios.



Cambio de las condiciones de activación para el apagado

Los archivos sobre todo usan la apertura o cierre del entorno multiusuario para iniciar la ejecución de los scripts. El siguiente archivo utiliza el comienzo de cuatro posibles procesos de apagado para iniciar sus scripts. Agregar o eliminar los objetivos en la línea Antes + la línea WantedBy le permitirá hacer distinciones más finas:

Este archivo fue propuesto en la segunda respuesta de esta publicación, pero no pude ejecutarlo hasta que agregué una sección de Instalación.

Nuevamente, edite el script /etc/systemd/service/y habilítelo usando systemctl enable your_file_name. Cuando cambié los objetivos utilicé el systemclt disable file_namecomando y luego lo volví a habilitar, lo que lo vinculó a los directorios de destino. Reinicie y el servicio estará operativo.

[Unit]
Description=Do something required
DefaultDependencies=no
Before=shutdown.target reboot.target halt.target
# This works because it is installed in the target and will be
#   executed before the target state is entered
# Also consider kexec.target

[Service]
Type=oneshot
ExecStart=/home/john/.my_script  #your path and filename

[Install]
WantedBy=halt.target reboot.target shutdown.target
John 9631
fuente
77
¿más fácil? más fácil que qué? más fácil que escalar el Everest? cualquier otra solución publicada aquí es más fácil que esta ...
Fran Marzoa
1
Wow, esa es una respuesta completa y decentemente escrita, y lo que todos deberían hacer: los problemas de nomenclatura con /etc/rc6.d y la confusión indican que esas no son buenas respuestas. Si un procedimiento es simple, entonces no necesariamente tiene poder para lograr su fin de manera segura. Consulte la sección [Instalar]: puede estar seguro de que su script se ejecutará en el momento correcto. Además, debido a que la respuesta es larga, ¡eso no significa que sea complejo! Gracias por cierto, John9631, esta respuesta es perfecta y será invaluable para crear guiones seguros y eficientes en un momento crítico de la misión ...
Miller el gorila
11
  1. Cree un archivo ejecutable de shell con su script en el directorio /etc/init.d/.

  2. Dado que esto debe ejecutarse durante el apagado o reinicio, es necesario crear enlaces suaves en /etc/rc0.d/ y /etc/rc6.d

Ejemplo:

sudo ln -s /etc/init.d/<your_file> /etc/rc0.d/k99stop_vm
sudo ln -s /etc/init.d/<your_file> /etc/rc6.d/k99stop_vm
sudo chmod a+x /etc/init.d/<your_file>
Ravi
fuente
chmodcambia las banderas de permiso del destino del enlace, que es lo mismo para ambos argumentos. Especificarlos a ambos es redundante.
David Foerster
2

Puede encontrar una solución aquí: suspender / reanudar todos los cuadros de Vagrant en el apagado / inicio del sistema .

Hay un script de inicio simple que suspende todos los cuadros en ejecución antes de apagarse.

Instalación

Edite /etc/init.d/vagrant-boxesy pegue el script del artículo anterior y guárdelo. O descárguelo desde aquí y guárdelo en /etc/init.d/vagrant-boxes. En debian / ubuntu, etc., ejecute

# update-rc.d vagrant-boxes defaults 99 01

El número 99 es el número de secuencia y debería ser mayor que (en mi caso, Virtualbox número 20, que por cierto es el predeterminado en las distribuciones de Debian). El segundo número es la secuencia al apagar la computadora. Por lo tanto, podría ser bueno hacer primero.

milkovsky
fuente