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.