Score:1

ไม่สามารถเข้าถึงพารามิเตอร์ Systemd ExecStart ภายในสคริปต์

ธง in

ฉันมีสถานการณ์ที่แปลกมาก

ฉันมีหน่วย systemd

[หน่วย]
Description=งานสำรองสแน็ปช็อตทุกคืนสำหรับโวลุ่ม [%i]

[บริการ]
ประเภท = ง่าย
KillMode=กระบวนการ
EnvironmentFile=/etc/systemd/schedule-backup_%i.conf
ExecStart=/usr/local/bin/backup.sh -s '$SOURCE' -b '$BACKUP' -t '$TITLE' -l 'backup_%i.log'

เมื่อฉันดำเนินการด้วยอินสแตนซ์บริการ: sudo systemctl เริ่ม [email protected]

สคริปต์ backup.sh ไม่ได้รับพารามิเตอร์สุดท้ายเลย ควรได้รับ "backup_projects.log"

ฉันกำลังอ่านพารามิเตอร์ด้วย

ในขณะที่รับค่าสถานะ s:b:t:l:
ทำ
    กรณี "${flag}" ใน
        s) source_path_root="${OPTARG}";;
        b) backup_path_root="${OPTARG}";;
        t) email_title="${OPTARG}";;
        ล) log_name="${OPTARG}";;
    เอสแซค
เสร็จแล้ว

เมื่อฉันตรวจสอบบันทึกการบริการ ดูเหมือนว่ามีการเรียกสคริปต์ด้วยพารามิเตอร์ที่เหมาะสม:

systemctl -l สถานะ [email protected] -n50

â [email protected] - งานสำรองสแนปชอตทุกคืนสำหรับปริมาณ [โครงการ]
     โหลดแล้ว: โหลดแล้ว (/etc/systemd/system/[email protected]; คงที่)
     ใช้งานอยู่: ไม่ได้ใช้งาน (ตายแล้ว) ตั้งแต่วันอังคารที่ 2021-12-14 12:47:01 EET; 16 นาทีที่แล้ว
TriggeredBy: âกำหนดการสำรองข้อมูล_projects.timer
    กระบวนการ: 8161 ExecStart=/usr/local/bin/backup.sh -s $SOURCE -b $BACKUP -t $TITLE -l backup_projects.log (code=exited, status=0/SUCCESS)
   PID หลัก: 8161 (รหัส=ออก สถานะ=0/สำเร็จ)
        ซีพียู: 3.122 วินาที

14 ธันวาคม 12:46:56 หุ่นยนต์ที่ล้ม systemd[1]: เริ่มงานสำรองสแน็ปช็อตตอนกลางคืนสำหรับวอลุ่ม [โปรเจ็กต์]
14 ธันวาคม 12:46:56 backup.sh หุ่นยนต์ตก [8161]: /usr/local/bin/backup.sh: บรรทัด 37: /var/log/: เป็นไดเร็กทอรี
14 ธันวาคม 12:46:56 backup.sh หุ่นยนต์ตก [8161]: ไฟล์บันทึกตั้งค่าเป็น /var/log/

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

แก้ไข: ดูเหมือนว่าจะทำงานเมื่อฉันใส่พารามิเตอร์ -l ในจุดเริ่มต้นแทนที่จะเป็นตอนท้าย อาจเป็นปัญหากับ getopts ฉันจะยอมรับคำตอบจากใครก็ตามที่สามารถอธิบายเรื่องนี้ได้

Score:1
ธง in

ฉันพบปัญหา systemd กำลังมีกฎของตัวเองสำหรับตัวแปรจาก EnvironmentFiles

https://fedoraproject.org/wiki/Packaging:Systemd#EnvironmentFiles_and_support_for_.2Fetc.2Fsysconfig_files

มันบอกว่า

จากนั้นคุณอาจอ้างถึงตัวแปรที่ตั้งค่าในไฟล์ /etc/sysconfig/httpd ด้วย ${FOOBAR} และ $FOOBAR ในบรรทัด ExecStart= (และที่เกี่ยวข้อง เส้น). (${FOOBAR} ขยายตัวแปรเป็นคำเดียว $FOOBAR แยก ขึ้นค่าตัวแปรที่ช่องว่างเป็นหลายคำ)

หลังจากที่ผมเปลี่ยนไลน์เป็น

ExecStart=/usr/local/bin/backup.sh -s ${SOURCE} -b ${BACKUP} -t ${TITLE} -l backup_%i.log

ปัญหาของฉันหายไป รวมถึงปัญหาที่มี TITLE ที่มีช่องว่าง หากไม่มี {} TITLE จะถูกขยายเป็น 3 คำ และเนื่องจากคำที่สองและสามปรากฏขึ้นโดยไม่มี '-' เพื่อรับตัวเลือก มันจะหยุดการประมวลผลพารามิเตอร์เพิ่มเติม ดังนั้นจึงไม่สนใจส่วน -l backup_%i.log

getopts ใช้การประมวลผลตัวเลือกมาตรฐาน ซึ่งหมายความว่า หยุดมองหาตัวเลือกเมื่อเห็นอาร์กิวเมนต์ที่ไม่ใช่ ตัวเลือก ...

ได้รับความอนุเคราะห์จาก https://unix.stackexchange.com/a/666748/499351

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา