systemd - Dando a mi servicio múltiples argumentos


44

¿Es posible darle a mi servicio systemd más de un argumento?

Me gustaría ejecutar un programa con múltiples argumentos que deben ser decididos por el usuario final.

P.ej: ./program arg1 arg2

Para iniciar una aplicación de argumento único, necesitaría algo como systemctl start arg1@program, en qué parte de la definición del servicio tengo ExecStart = /usr/bin/program ℅i.

¡Gracias!


1
Parece que lo que quieres es un archivo de configuración.
Daniel B

Necesito cambiarlo sobre la marcha. ¿Necesito estrictamente un archivo conf?
peperunas

@peperunas que no es necesario un archivo de configuración, vea mi respuesta, que funciona sin ningún tipo de archivos extra
nonagon

Respuestas:


34

¡Sí tu puedes! Defínalos en un archivo en algún lugar y agrégalos a EnvironmentFiletu servicio systemd. Por ejemplo, supongamos que los contenidos de /etc/.progconf son:

ARG1=-o
ARG2=--verbose

Y tu archivo .service:

EnvironmentFile=/etc/.progconf
ExecStart = /usr/bin/prog $ARG1 $ARG2

Puede escribir en ese archivo si necesita cambiarlos sobre la marcha. Un servicio no debe cambiar sus opciones muy a menudo, tal vez considere iniciar automáticamente o cron si necesita lograrlo.

Para ver más ejemplos, consulte: https://wiki.archlinux.org/index.php/Systemd/Services


Je, bastante útil, no pensó en eso. Sin embargo, tengo que estar de acuerdo: los parámetros de servicio no cambian de manera regular, y tampoco lo hacen sus archivos de configuración.
Daniel B

si el archivo de servicio usa variables de entorno, ¿puede decir VAR1=... VAR2=... systemctl start foobar.serviceque pasa las variables?
Johannes Schaub - litb

Sí, creo que puedes
platforma

66
@ JohannesSchaub-litb, no, no puedes. Hay una PassEnvironmentdirectiva, pero toma variables del systemdproceso (normalmente PID 1), no de systemctl. Las variables de entorno del systemctlproceso no se propagan al servicio que se inicia.
cjm

2
Pero el arranque puede ejecutar múltiples instancias del mismo servicio, con diferentes parámetros. Por ejemplo, un servidor de correo en eth0 y otra instancia de dicho servidor de correo en eth1, pasando el parámetro a upstart y administrándolos como servicios separados. ¿Puede systemd hacer esto?
LtWorf

15

Quería hacer lo mismo, pero sin un archivo separado para cada combinación de argumentos. Descubrí que podía pasar un argumento largo con espacios y luego usar la función de división de espacio variable de entorno de systemd para separar los argumentos.

Hice un servicio con nombre de archivo argtest@.service( tenga en cuenta el 'at sign' final que se requiere cuando un servicio toma argumentos ).

[Unit]
Description=Test passing multiple arguments

[Service]
Environment="SCRIPT_ARGS=%I"
ExecStart=/tmp/test.py $SCRIPT_ARGS

Ejecuto esto sudo systemctl start argtest@"arg1 arg2 arg3".servicey pasa arg1, arg2y arg3como argumentos de línea de comandos separados para test.py.


"tenga en cuenta el ampersand final": no encuentro ampersand en su respuesta. ¿Puedes editar tu respuesta para ser más claro sobre este punto?
Patrick Mevzek

Sí, lo siento por eso!
nonagon

Creo que la @ solo es necesaria cuando usas el% I como lo haces. Es una instancia del servicio.
Toby

De acuerdo, me encontré con algunas publicaciones de blog que lo omitieron. Aclararé en mi respuesta.
nonagon

Esto no parece funcionar desde otro servicio. Lo intenté Wants=argtest@"arg1 arg2".servicey solo se aprobó el primer argumento.
Roger Dueck

1

Lo más fácil que he encontrado es:

ExecStart=/bin/bash -c "\"/path/with spaces/to/app\" arg1 arg2 arg3 \"arg with space\""

Lo mantiene todo autocontenido.

Dicho esto, descubrí que al menos en Ubuntu 18.04 LTS, ni siquiera necesito hacer eso, puedo hacer esto y funciona bien:

ExecStart="/path/with spaces/to/app" arg1 arg2 arg3 "arg with space"

$vars funcionan como argumentos con este patrón también.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.