จะระบุคำสั่ง Environment systemd ที่มี = ได้อย่างไร?


20

ฉันต้องการระบุEnvironment systemdคำสั่งที่มี=เช่น

Environment=CATALINA_OPTS=-Dappserver.home=/var/lib/archiva/apache-tomcat-current -Dappserver.base=/var/lib/archiva/apache-tomcat-current

และรับข้อผิดพลาด

[/lib/systemd/system/archiva.service:10] Invalid environment assignment, ignoring: CATALINA_OPTS=-Dappserver.home\=/var/lib/archiva/apache

ในjournalctl -xe. ฉันพยายามที่จะพูดด้วย"และ'และจะหลบหนี=ด้วยการ\ไม่ประสบความสำเร็จ ดูเหมือนว่าจะไม่มีเอกสาร

คำตอบ:


40

ฉันคิดว่าปัญหาของคุณเกิดจากพื้นที่ในเนื้อหาของตัวแปรสภาพแวดล้อม ดูตัวอย่างจากsystemd docsการมอบหมายควรเป็นสตริงเดี่ยว:

ตัวอย่าง:

Environment="ONE=one" 'TWO=two two'
ExecStart=/bin/echo $ONE $TWO ${TWO}

ซึ่งจะดำเนินการ / bin / echo กับสี่ข้อโต้แย้ง: one, two, และtwotwo two

ตัวอย่าง:

Environment=ONE='one' "TWO='two two' too" THREE=
ExecStart=/bin/echo ${ONE} ${TWO} ${THREE}
ExecStart=/bin/echo $ONE $TWO $THREE

ผลสะท้อนในนี้ถูกเรียกว่าเป็นครั้งที่สองเป็นครั้งแรกที่มีการขัดแย้ง 'one', 'two two' too, และเป็นครั้งที่สองที่มีการขัดแย้ง one, ,two twotoo

ฉันทดสอบสิ่งนี้ด้วยบริการต่อไปนี้ (จดเครื่องหมายคำพูดรอบการมอบหมายทั้งหมด):

[Unit]
Description=My Daemon

[Service]
Environment='CATALINA_OPTS=-Dappserver.home=/var/lib/archiva/apache-tomcat-current -Dappserver.base=/var/lib/archiva/apache-tomcat-current'
ExecStart=/bin/echo ${CATALINA_OPTS}

[Install]
WantedBy=multi-user.target

และได้ผลลัพธ์ที่ต้องการในjournalctl:

Apr 26 08:19:29 laptop echo[28439]: -Dappserver.home=/var/lib/archiva/apache-tomcat-current -Dappserver.base=/var/lib/archiva/apache-tomcat-current

แน่นอนว่ามันจะใช้ง่ายกว่าEnvironmentFileแทน การแทนที่Environmentด้วยข้อมูลต่อไปนี้ให้ผลลัพธ์ที่ต้องการเหมือนกัน:

EnvironmentFile=/tmp/foo

ที่/tmp/fooมีอยู่ (หมายเหตุขาดคำพูด):

CATALINA_OPTS=-Dappserver.home=/var/lib/archiva/apache-tomcat-current -Dappserver.base=/var/lib/archiva/apache-tomcat-current

เมื่อพูดถึงคำพูด (เช่นโดยใช้CATALINA_OPTSในsystemdสภาพแวดล้อมสำหรับ Apache tomcat7.0.61) การใช้งานEnvironmentFileจริงเป็นวิธีที่จะไป ขอบคุณ!
Karl Richter

ไดเรกทอรีมาตรฐาน / การประชุมสำหรับการเก็บ EnvironmentFile บน Ubuntu คืออะไร? ในระบบอื่น ๆ ที่ฉันเคยเห็น / etc / sysconfig /
Davos

1
@Davos /etc/defaultเป็นสถานที่ที่เหมาะสมจะเป็น ไฟล์ที่มีการใช้ในอดีตสำหรับการวางตัวแปรสภาพแวดล้อมสำหรับสคริปต์ init ที่สอดคล้องกัน
muru

ฉันมีไฟล์นี้อยู่แล้วในระบบของฉัน / etc / สภาพแวดล้อมที่มีตัวแปรเส้นทางจะผนวกกับที่เหมาะสม?
Davos

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