Ejecute un script al cerrar sesión / reiniciar / apagar en Ubuntu

30

Me gustaría ejecutar un .sharchivo usando bash al cerrar sesión y apagar Ubuntu. He buscado arriba y abajo en la web y solo he encontrado soluciones para KDE y GNOME. El script es simple, solo necesito saber si puedo agregar la línea de código al archivo "cerrar sesión / apagar" o si necesito hacer referencia a él en otro script.

DirtyDenimDan
fuente
1
Ponga enlaces simbólicos a ejecutables en /etc/init.d en /etc/rc0.d, y /etc/rc6.d
Yet Another User
2
Considere aceptar la respuesta actualizada (usando systemd) para que las personas la vean en la parte superior.
Jonathan Y.

Respuestas:

18

Para ejecutar un script al cerrar sesión:

Agregue la siguiente línea:

session-cleanup-script=/path/to/script

en el /etc/lightdm/lightdm.confarchivo

Debe reiniciar lightdm para que este cambio surta efecto. Para hacer esto, ingrese en tty1 usando Ctrl+ Alt+ F1, inicie sesión con su nombre de usuario y contraseña y ejecute el siguiente comando:

sudo service lightdm restart

Nota: use Ctrl+ Alt+ F7para cambiar a la sesión gráfica

Para ejecutar un script al reiniciar:

  1. Pon tu guión en /etc/rc0.d
  2. Hazlo ejecutable: sudo chmod +x K99_script
  3. Notas:
    • Los scripts en este directorio se ejecutan en orden alfabético.
    • El nombre de su script debe comenzar K99por ejecutarse en el momento adecuado.

Para ejecutar un script al apagar:

  1. Pon tu guión en /etc/rc6.d
  2. Hazlo ejecutable: sudo chmod +x K99_script
  3. Notas:
    • Los scripts en este directorio se ejecutan en orden alfabético.
    • El nombre de su script debe comenzar K99por ejecutarse en el momento adecuado.

Fuentes:

Radu Rădeanu
fuente
44
Es convencional nombrar guiones que comienzan con K'Kill' y S'Start'.
kiri
¿Qué pasa si el script necesita privilegios de sudo? Por lo que puedo decir, los scripts /etc/rc6.d se ejecutan como usuario y no pueden usar gksudo.
Urhixidur
1
no funciona para mí con 14.04, ¿hay algún cambio o hecho importante no especificado?
tomasb
2
El consejo de K99 no es bueno para apagar / reiniciar si desea guardar algunos datos porque sucede DESPUÉS de desmontar Y K se usa para deshabilitar el script (consulte /etc/rcS.d/README), use S para iniciar y colocarlo antes de desmontar, para el arranque a cabo la secuencia de comandos después del montaje, se quedó atascado en esto porque esta falta de información, se resolvió con S como la primera letra
tomasb
66
Esto está muy mal: i) los nombres de script deben comenzar con a Kpara los niveles de ejecución 0, 1 y 6 y Spara los niveles de ejecución 2, 3, 4 y 5; ii) no necesita llamar al script K99_foo, el número solo determina el orden en que se ejecutan los scripts. Debe elegir uno que sea más grande que los otros si desea que se ejecute en último lugar; iii) ¡ Runlevel 0 no es para reiniciar! ; Es para el cierre. 6 es para reiniciar. iv) los scripts no tienen por qué estar en los /etc/rcN.ddirectorios. En su lugar, deberían estar /etc/init.dy vincularse a/etc/rcN.d .
terdon
14

Cómo hacerlo con systemd

Si encuentra este hilo después de junio de 2016, Ubuntu y sus derivados, incluido Mint, usarán systemd para controlar la inicialización y el apagado del sistema. Tuve problemas con el viejo enfoque, así que investigué la forma del sistema.

Con systemd, crea uno o dos archivos para llamar a sus scripts utilizando las plantillas a continuación y ejecuta un comando. Simple.


Versión GUI

Primero cree los scripts que desea ejecutar al inicio y / o apagado. 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 programa.

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 ingrese al 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.


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 mostró 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 una respuesta en Unix y Linux por @Matthias, 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, usé 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
1
Aunque su publicación es correcta, sugeriría mejorarla agregando ejemplos de cómo se pueden realizar estos pasos con los sistemas. Avísame una vez que edites tu publicación. Gracias y bienvenidos a AskUbuntu
Sergiy Kolodyazhnyy
Hola Serg, ¿te refieres a ejemplos como en la publicación vinculada o tenías algo más en mente? En segundo lugar, no estoy seguro de cómo "hacerle saber", ya que no puedo encontrar un mecanismo para contactar a otro usuario de SO.
John 9631
Sí, podría proporcionar un ejemplo igual que en su otra publicación. Simplemente decir "ir a ese otro enlace" no es muy bueno y hace que su respuesta parezca vaga. También para contactar a otro usuario de SO use @ antes del nombre de usuario, por ejemplo @Serg
Sergiy Kolodyazhnyy
Mucho mejor. Muy bien, ¡sigan con el buen trabajo!
Sergiy Kolodyazhnyy
1
de acuerdo con man systemd.unitlos archivos creados por el usuario se pueden colocar en $XDG_CONFIG_HOME/systemd/usery otras ubicaciones de usuarios locales
Antonios Hadjigeorgalis