Tengo un script BASH que quiero ejecutar en el inicio. Mi sistema está ejecutando systemd, así que creé un archivo .service con lo que creo que es la información necesaria:
[Unit]
Description=My Script
After=network.target
[Service]
ExecStart=/home/myscript.sh
[Install]
WantedBy=multi-user.target
Usé systemctl enable para 'registrarlo' y reiniciarlo. En el arranque, me dijeron que mi script se ejecutaría, pero no pude ver ninguno de los mensajes que ECHO debería mostrar en la pantalla ni escribir algo en un archivo, de acuerdo con lo que había escrito en el script. Además, no inicia la aplicación que se supone que debe iniciar.
El estado de Systemctl me dice que la secuencia de comandos se ejecutó y salió correctamente. Aún así, el guión no tiene ningún efecto. Si ejecuto el script desde un shell, funciona perfectamente bien.
¿Alguno de ustedes sabe cuál podría ser mi problema?
Respuestas:
Además de lo que TokyoMEWS encontró por sí mismo ...
(que no es completamente correcto,
Type=forking
solo se hace necesario si su script sale mientras se ejecutan sus hijos )... otros posibles problemas son:
Supongo que por "mostrar en pantalla" querías decir que el script simplemente escribe algo en stdout. Esto no va a la pantalla durante el arranque; más bien, todo, desde la salida estándar de un servicio, se envía al diario (o al registro del sistema según la versión de su sistema).
Si has hecho intento de escritura a la pantalla (por ejemplo, usando
echo Hi >/dev/tty1
), entonces es muy probable que la producción de la secuencia de comandos desaparece cuando agetty borra la pantalla antes de mostrar indicadores de conexión. (Para evitar eso, tendrías que pedir la unidad[email protected]
).Para escribir algo en un archivo, debe tener el sistema de archivos montado lectura-escritura. Para esto,
After=local-fs.target
podría ser necesario, de lo contrario, la unidad podría iniciarse nuevamente demasiado pronto. Pero esto depende de la configuración específica del sistema operativo.fuente
Si su script define la cláusula ExecStop también, debe establecer " RemainAfterExit = yes" para evitar que se llame a ExecStop automáticamente después de ExecStart . Esto permitirá que su servicio esté en estado " activo " después de ejecutar el comando ExecStart .
fuente