systemd - ให้บริการของฉันหลายข้อโต้แย้ง


44

เป็นไปได้หรือไม่ที่จะให้บริการ systemd ของฉันมากกว่าหนึ่งข้อโต้แย้ง?

ฉันต้องการรันโปรแกรมที่มีอาร์กิวเมนต์หลายตัวซึ่งต้องตัดสินใจโดยผู้ใช้ขั้นสุดท้าย

เช่น: ./program arg1 arg2

ในการเริ่มต้นมันเป็น app อาร์กิวเมนต์เดียวที่ฉันจะต้องสิ่งที่ต้องการที่อยู่ในคำนิยามบริการฉันมีsystemctl start arg1@programExecStart = /usr/bin/program ℅i

ขอบคุณ!


1
เสียงเหมือนสิ่งที่คุณต้องการคือไฟล์กำหนดค่า
Daniel B

ฉันต้องเปลี่ยนมันในระหว่างการเดินทาง ฉันต้องการไฟล์ conf อย่างเคร่งครัดหรือไม่?
peperunas

@peperunas คุณไม่จำเป็นต้องไฟล์ conf ให้ดูคำตอบของฉันที่ทำงานโดยไม่ต้องไฟล์พิเศษใด ๆ
เก้าเหลี่ยม

คำตอบ:


33

ใช่คุณสามารถ! กำหนดไว้ในไฟล์ที่ใดที่หนึ่งและเพิ่มไว้EnvironmentFileใน systemd Service ของคุณ ตัวอย่างเช่นพูดเนื้อหาของ /etc/.progconf คือ:

ARG1=-o
ARG2=--verbose

และ. ไฟล์บริการของคุณ:

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

คุณสามารถเขียนไปยังไฟล์นั้นได้หากคุณต้องการเปลี่ยนแปลงมันในระหว่างการเดินทาง บริการไม่ควรเปลี่ยนแปลงตัวเลือกบ่อยนักอาจพิจารณาการเริ่มอัตโนมัติหรือ cron ถ้าคุณจำเป็นต้องทำเช่นนั้น

สำหรับตัวอย่างเพิ่มเติมให้ตรวจสอบที่: https://wiki.archlinux.org/index.php/Systemd/Services


เฮ้ค่อนข้างมีประโยชน์ไม่คิดอย่างนั้น ฉันต้องยอมรับว่า: พารามิเตอร์บริการจะไม่เปลี่ยนแปลงเป็นประจำและไม่มีการกำหนดค่าไฟล์
Daniel B

ถ้าไฟล์บริการใช้ตัวแปรสภาพแวดล้อมคุณสามารถพูดVAR1=... VAR2=... systemctl start foobar.serviceเพื่อส่งต่อตัวแปรได้หรือไม่?
Johannes Schaub - litb

ใช่ฉันเชื่อว่าคุณทำได้
แพลตฟอร์ม

6
@ JohannesSchaub-litb ไม่คุณไม่สามารถ มีเป็นPassEnvironmentคำสั่ง แต่มันต้องใช้ตัวแปรจากsystemdกระบวนการ (ปกติ PID 1) systemctlไม่ได้มาจาก ตัวแปรสภาพแวดล้อมจากsystemctlกระบวนการไม่ได้แพร่กระจายไปยังบริการที่กำลังเริ่มต้น
cjm

2
แต่คนธรรมดาสามารถเรียกใช้บริการเดียวกันหลายอินสแตนซ์โดยมีพารามิเตอร์ต่างกัน ตัวอย่างเช่นเมลเซิร์ฟเวอร์บน eth0 และอีกอินสแตนซ์ของ mailserver ดังกล่าวบน eth1 ผ่านพารามิเตอร์เพื่อพุ่งพรวดและจัดการพวกเขาเป็นบริการแยกต่างหาก systemd ทำสิ่งนี้ได้หรือไม่?
LtWorf

15

ฉันต้องการทำสิ่งเดียวกัน แต่ไม่มีไฟล์แยกต่างหากสำหรับการรวมกันของข้อโต้แย้ง ฉันพบว่าฉันสามารถส่งผ่านอาร์กิวเมนต์ยาว ๆ หนึ่งช่องว่างและใช้คุณลักษณะการแยกช่องว่างตัวแปรสภาพแวดล้อมของ systemd เพื่อแยกอาร์กิวเมนต์

ฉันทำบริการด้วยชื่อไฟล์argtest@.service( โปรดสังเกตส่วนต่อท้าย 'at sign' ซึ่งจำเป็นเมื่อบริการใช้อาร์กิวเมนต์ )

[Unit]
Description=Test passing multiple arguments

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

ผมทำงานนี้กับsudo systemctl start argtest@"arg1 arg2 arg3".serviceและมันผ่านไปarg1, arg2และarg3เป็นอาร์กิวเมนต์บรรทัดคำสั่งที่แยกต่างหากเพื่อ test.py.


"บันทึกเครื่องหมายแอมเปอร์แซนด์": ฉันไม่พบเครื่องหมายแอมเปอร์แซนด์ในการตอบกลับของคุณ คุณสามารถแก้ไขคำตอบของคุณเพื่อให้ชัดเจนในจุดนี้?
Patrick Mevzek

ใช่ขอโทษด้วย!
nonagon

ฉันคิดว่า @ จะต้องเฉพาะเมื่อคุณใช้% I ตามที่คุณทำ มันเป็นตัวอย่างของการบริการ
Toby

เห็นด้วยฉันเพิ่งวิ่งเข้าไปในบล็อกโพสต์ไม่กี่ที่ละเว้นมัน ฉันจะชี้แจงในคำตอบของฉัน
nonagon

ดูเหมือนว่านี่จะไม่ทำงานจากภายในบริการอื่น ฉันพยายามWants=argtest@"arg1 arg2".serviceแล้วก็ผ่านการโต้แย้งครั้งแรกเท่านั้น
Roger Dueck

1

ง่ายที่สุดที่ฉันพบคือ:

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

เก็บทุกอย่างไว้ในตัว

ต้องบอกว่าฉันพบว่าอย่างน้อยใน Ubuntu 18.04 LTS ฉันไม่จำเป็นต้องทำอย่างนั้นฉันสามารถทำได้และใช้งานได้ดี:

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

$vars ทำงานเป็นอาร์กิวเมนต์ด้วยรูปแบบนี้เช่นกัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.