สร้างไดเร็กทอรีภายใต้ / var / run at boot


39

ฉันมีดีมอนที่ต้องการไดเรคของตัวเอง/var/runสำหรับไฟล์ PID ที่ได้รับอนุญาตให้เขียนกับผู้ใช้ของดีมอน

ฉันพบว่าฉันสามารถสร้าง dir นี้ด้วยคำสั่งเหล่านี้:

# mkdir /var/run/mydaemon

จากนั้นฉันสามารถเปลี่ยนความเป็นเจ้าของเป็นผู้ใช้ / กลุ่มที่ฉันต้องการเรียกใช้กระบวนการ:

# chown myuser:myuser /var/run/mydaemon

แต่ dir นี้จะหายไปทุกครั้งที่ฉันรีบูต! ฉันจะทำให้ dir นี้สร้างทุกครั้งที่บูทเครื่องได้อย่างไร

คำตอบ:


55

สองทางเลือกในการมี systemd สร้างไดเรกทอรีโดยทั่วไปที่ง่ายที่สุดคือการประกาศ a RuntimeDirectoryในไฟล์หน่วยของบริการของคุณ:

RuntimeDirectory=, RuntimeDirectoryMode= ใช้รายการชื่อไดเรกทอรี หากตั้งไว้หนึ่งหรือหลายไดเรกทอรีโดยใช้ชื่อที่ระบุจะถูกสร้างขึ้นด้านล่าง/run(สำหรับบริการของระบบ) หรือต่ำกว่า $ XDG_RUNTIME_DIR (สำหรับบริการผู้ใช้) เมื่อหน่วยเริ่มทำงานและจะถูกลบเมื่อหน่วยหยุดทำงาน ไดเรกทอรีจะมีโหมดการเข้าถึงที่ระบุไว้ในRuntimeDirectoryMode=และจะเป็นเจ้าของโดยผู้ใช้และกลุ่มที่ระบุในและUser= Group=ใช้สิ่งนี้เพื่อจัดการหนึ่งหรือมากกว่าหนึ่งไดเรกทอรีรันไทม์ของหน่วยและผูกอายุการใช้งานกับ daemon runtime ชื่อไดเรกทอรีที่ระบุต้องสัมพันธ์กันและอาจไม่มี "/"คือต้องอ้างถึงไดเรกทอรีง่าย ๆ ในการสร้างหรือลบนี่เป็นประโยชน์อย่างยิ่งสำหรับ daemons ที่ไม่ได้รับสิทธิพิเศษซึ่งไม่สามารถสร้างไดเรกทอรีรันไทม์ใน / เรียกใช้เนื่องจากขาดสิทธิ์และเพื่อให้แน่ใจว่าไดเร็กทอรีรันไทม์ถูกล้างโดยอัตโนมัติหลังการใช้งาน

หรือสำหรับไดเรกทอรีรันไทม์ที่ต้องการการกำหนดค่าที่ซับซ้อนมากขึ้นหรือแตกต่างกันหรือรับประกันตลอดชีวิตให้ใช้tmpfiles.dและให้แพ็คเกจของคุณวางไฟล์/usr/lib/tmpfiles.d/mydaemon.conf:

 #Type Path            Mode UID      GID    Age Argument
 d     /run/mydaemon   0755 myuser myuser   -   -

ฉันใช้หลังเพราะภูตจริงใช้systemd-sysv-generatorและฉันมีเส้นโค้งการเรียนรู้เพียงพอสำหรับสัปดาห์ เพียงแค่ไฟล์. conf หนึ่งไฟล์และหนึ่งบรรทัด รู้สึกดีตอนนี้ B-)
24601

ฉันได้แล้วมีหลังที่กำหนดไว้ในของฉัน/usr/lib/tmpfiles.d/php7.3-fpm.confและ/usr/lib/tmpfiles.d/php7.2-fpm.confและมันยังคงไม่สร้าง/run/phpไดเรกทอรี
MarthyM

3

ฉันสร้างบริการที่จะทำให้ dir ตั้งแต่เริ่มต้น:

vim /etc/systemd/system/mydaemon-helper.service

เนื้อหาของ/etc/systemd/system/mydaemon-helper.service:

[Unit]
Description=MyDaemon Helper Simple Service
After=network.target

[Service]
Type=simple
ExecStartPre=-/usr/bin/mkdir /var/run/mydaemon
ExecStart=/usr/bin/chown myuser:myuser /var/run/mydaemon
Restart=on-abort


[Install]
WantedBy=multi-user.target

จากนั้นฉันก็เริ่มให้บริการนี้:

systemctl start mydaemon-helper

systemctl status mydaemon-helper

เอาท์พุท:

[root@alpha etc]# systemctl status mydaemon-helper.service
● mydaemon-helper.service - MyDaemon Helper Simple Service
   Loaded: loaded (/etc/systemd/system/mydaemon-helper.service; disabled; vendor preset: disabled)
   Active: inactive (dead)

May 28 20:53:50 alpha systemd[1]: Starting MyDaemon Helper Simple Service...
May 28 20:53:50 alpha systemd[1]: Started MyDaemon Helper Simple Service.

สุดท้ายฉันบอกให้ระบบทำการโหลดเมื่อเริ่มต้น:

systemctl enable mydaemon-helper


ตกลงฉันเดาว่าฉันควรจะวางคำถามนี้ไว้ในข้อพิจารณาของฉัน ฉันกำลังเรียนรู้ว่า - ขอบคุณพวกคุณ!
user24601

2
ไม่การสร้างคำตอบเป็นสิ่งที่ถูกต้องที่ต้องทำเพื่อให้ผู้คนสามารถแสดงความคิดเห็นได้และไม่ทำให้คำถามของคุณยุ่งเหยิง การตอบคำถามของคุณได้รับการสนับสนุนอย่างชัดเจนใน SO และคำตอบของคุณก็ไม่ผิดเหมือนกันนั่นเป็นเพียงวิธีที่ดีกว่าในการทำเช่นนี้ดังนั้น IMO คุณจึงไม่ควรถูกลดระดับลง ไม่ควรอัปโหลดด้วยเช่นกัน :)
Bryan Larsen

2
ในขณะRuntimeDirectoryที่วิธีที่ดีกว่าในการทำเช่นนี้ในตอนนี้ฉันวิ่งเข้าไปในเซิร์ฟเวอร์ที่มี systemd รุ่นเก่า (208) ซึ่งไม่มีคำสั่งนั้นดังนั้นคำตอบนี้เป็นวิธีแก้ปัญหาเพียงอย่างเดียว
Davor Cubranic

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