Score:0

Multiple instances of systemd unit not writing to log files

ธง jp

I'm trying to create a systemd unit file that will take an argument for a php script.

The small php script:

<?php
$val = $argv[1];

while(true) {
        echo "Argument = $val\n";
        sleep(1);
}
?>

Devs are working on the real script. All I need to do to test is take an argument, which is passed in the systemd unit file. Here it is:

[email protected]

[Unit]
Description=Systemd Params Test
Wants=network-online.target
After=network-online.target

[Service]
Environment=ARGS=%I
ExecStart=/usr/bin/php /home/myself/test_systemd.php $ARGS
StandardOutput=file:/var/log/test-multiple-systemd-$ARGS.log

[Install]
#Start after boot
WantedBy=multi-user.target

I start the multiple instances with systemctl start [email protected] and systemctl start [email protected]. When checking the services, I see:

root@servername:/lib/systemd/system# systemctl --type=service | grep test
[email protected]      loaded active running Systemd Params Test                                                          
[email protected]      loaded active running Systemd Params Test 

It is not creating the different log files. It's only creating a single one, strangely with quotes around it:

-rw-r--r-- 1 root root 285 Dec 8 08:15 'test-multiple-systemd-$ARGS.log'

And the content of the log file is mostly "Argument = bar". Only a few instances of "Argument = foo" for some reason:

cat /var/log/test-multiple-systemd-\$ARGS.log

Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = bar
Argument = foo <--- WHY???
Argument = foo
Argument = foo
Argument = foo
Argument = foo
Argument = foo

Is it possible to write to different log files for each instance of the systemd unit? I would like to see test-multiple-systemd-foo.log and test-multiple-systemd-bar.log if those are the arguments I pass. I've tried escaping the $ in the log path to no avail. I've tried removing and adding quotes to the Environment="$ARGS=%I" also to no avail. The log always shows with quotes with the literal "$ARGS" in the name.

UPDATE

It appears I cannot create the multiple log files dynamically, per this answer.

So, I created the log writing in the php script with:

echo file_put_contents("/var/log/test-multiple-systemd-$val.log", "Argument=$val", FILE_APPEND);

Will this suffice? I'm getting the multiple log files now and they are writing the argument correctly to the log file.

Gerrit avatar
cn flag
ในขณะที่เริ่มต้นไฟล์จากสคริปต์ของคุณ ฉันจะบอกว่าการใช้ไดเร็กทอรีทั้งระบบ /var/log สำหรับสคริปต์ bash อาจไม่ปลอดภัย และคุณยังต้องต่อสู้กับ stderr/stdout ที่ไม่คาดคิดซึ่งมาจากสคริปต์ คุณพิจารณาแค่ใช้บันทึกประจำวันและ `systemd-cat` หรือ `logger` ในสคริปต์ของคุณหรือไม่
DevOpsSauce avatar
jp flag
นี่ไม่ใช่เส้นทางบันทึกถาวร ฉันแค่ทดสอบบนเซิร์ฟเวอร์ dev :) บันทึกอยู่ในไดเร็กทอรีย่อยของ /var/log/ มีมาระยะหนึ่งแล้ว แต่ตอนนี้พวกเขาต้องการสคริปต์เดียวกันหลายอินสแตนซ์
Gerrit avatar
cn flag
อาจไม่สมเหตุสมผลที่จะนำ ARGS เข้าสู่สภาพแวดล้อม หากคุณรวมข้อมูลนี้ไว้ในบรรทัด ExecStart แล้ว เพียงใช้ '%i" ในบรรทัด ExecStart และทำมันให้เสร็จ เลือก %i ที่นี่ เพราะไม่เช่นนั้นคุณอาจหลีกเลี่ยงเครื่องหมายอัญประกาศและคำที่ไม่ต้องการและการแยกคำโดยเชลล์ไม่ใช่ปัญหาหากคุณใช้เฉพาะตัวเลข แต่ขอแนะนำอย่างยิ่งสำหรับการใช้วิธีส่งผ่านตัวแปรอินสแตนซ์โดยทั่วไปมากขึ้น
Gerrit avatar
cn flag
ดูที่นี่สำหรับแนวคิดในการรวมอินสแตนซ์ของคุณเข้ากับเป้าหมายที่สามารถเรียกใช้ชุดที่กำหนดของอินสแตนซ์: https://www.stevenrombauts.be/2019/01/run-multiple-instances-of-the-same-systemd -หน่วย/
Score:0
ธง sa

คุณควรแก้ไขของคุณ .บริการ ไฟล์สำหรับไฟล์บันทึกหลายไฟล์ ตัวแปรควรมีเครื่องหมายปีกกา {}. แบบนี้:

ExecStart=/usr/bin/php /home/myself/test_systemd.php ${ARGS}
StandardOutput=file:/var/log/test-multiple-systemd-${ARGS}.log

โพสต์คำตอบ

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