es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Script ejecutado por un servicio de systemd que no borra el archivo del servicio.

Estoy tratando de crear un servicio systemd que ejecute un script de shell al reiniciar, este script eliminará algunos archivos, eliminará el servicio y luego se eliminará a sí mismo. Pero cuando habilito el servicio, se ejecuta el script, se eliminan los archivos, pero falla la eliminación del servicio. Mi script es:

rm /var/local/myvars/file
systemctl stop myservice.service
systemctl disable myservice.service
rm /etc/systemd/system/myservice.service
systemctl daemon-reload
systemctl reset-failed
rm /var/tmp/myscript

myservice.service es:

[Unit]
Descripción = Ejecutar script al reiniciar
Before = 
[Service]
Type=oneshot
ExecStart=/var/tmp/myscript
RemainAfterExit=no
[Install]
WantedBy=multi-user.target

¿Qué estoy haciendo mal? Lo que quiero hacer es eliminar ciertos archivos después del reinicio, por lo tanto, quiero una manera de ejecutar algún script solo una vez después del reinicio. ¿Es esta la forma correcta de hacerlo o hay alguna otra mejor manera?

Tags:  ,

Answer

  1. Avatar for davy.ai

    El problema es que systemd está intentando detener y deshabilitar el servicio mientras se está ejecutando, lo cual no está permitido.

    Un enfoque mejor sería que el script se ejecute una sola vez en el momento del arranque y luego se elimine del sistema, en lugar de intentar eliminar el servicio que lo ejecuta. Esto se puede lograr usando el comando systemctl edit para crear un servicio de una sola vez que ejecute el script en el momento del arranque, de la siguiente manera:

    1. Cree un nuevo archivo de servicio utilizando:
      sudo systemctl edit --force --full myscript.service
      
    2. En el editor, pegue lo siguiente:
      [Unit]
      Description=Ejecuta script al inicio del arranque
      DefaultDependencies=no
      Before=local-fs.target
      
      [Service]
      Type=oneshot
      ExecStart=/var/tmp/myscript
      RemainAfterExit=yes
      
      [Install]
      WantedBy=multi-user.target
      
    3. Guarde el archivo y salga del editor.
    4. Cambie los permisos del script para incluir permisos de ejecución:

      sudo chmod +x /var/tmp/myscript
      

    5. En el propio script, agregue una línea para eliminar el archivo myscript.service:
      rm /etc/systemd/system/myscript.service
      
    6. Reinicie el sistema y el script debería ejecutarse una sola vez en el momento del arranque, eliminar el archivo y, a continuación, eliminar el servicio.

    Este enfoque evita el problema de intentar eliminar un servicio en ejecución y asegura que el script se ejecute solo una vez en el momento del arranque.

Comments are closed.