แก้ไขไฟล์ systemd unit โดยไม่แก้ไขไฟล์ upstream unit


24

ผมได้ติดตั้งบริการโดยวิธีการของpimd aptสิ่งนี้มาพร้อมกับsystemdไฟล์อัปสตรีมยูนิต ( /lib/systemd/system/pimd.service)

ฉันต้องการบริการที่จะเริ่มต้นใหม่เมื่อด้วยเหตุผลบางอย่างที่จะได้รับการฆ่าดังนั้นฉันต้องการที่จะเพิ่มบรรทัดRestart = alwaysในไฟล์หน่วย

อย่างไรก็ตามฉันไม่ต้องการแก้ไขไฟล์หน่วยต้นน้ำ

มีวิธีแก้ปัญหาสำหรับสิ่งนี้หรือไม่?



คุณลองทำอะไร
030

คำตอบ:


35

คุณมีสองทางเลือก:

  • คัดลอกแฟ้มหน่วยจากไป/lib/systemd/system/ จากนั้นทำการแก้ไขเพื่อแทนที่ไฟล์หน่วยที่จัดทำโดยผู้ดูแลแพ็คเกจ /etc/systemd/system/
    /etc/systemd/system/pimd.service

    คำสั่งจะsystemctl edit --full <service-name>ทำสิ่งนี้ให้คุณโดยอัตโนมัติ

  • คุณสามารถแก้ไขหรือเพิ่มการตั้งค่าเฉพาะสำหรับหน่วยโดยไม่ต้องแก้ไขไฟล์หน่วยโดยสร้าง.confไฟล์ในไดเรกทอรีดรอปอิน /etc/systemd/system/<unit-name>.<unit-type>.d/
    เช่นสร้าง/etc/systemd/system/pimd.service.d/restart.conf

    คำสั่งsystemctl edit <service-name>ดำเนินการตามขั้นตอนเหล่านี้เพื่อคุณ

ดู man systemd.unit


10
ตัวเลือกที่สองสามารถทำได้ง่ายขึ้นโดยใช้systemctl edit <service-name>
muru

7
systemctl edit --full <service-name>และคนแรกโดยใช้
grawity

22

เอกสาร RHEL แนะนำสองวิธี:

  1. ขยายไฟล์หน่วยเริ่มต้นด้วยการสร้างไดเรกทอรีการกำหนดค่าและไฟล์ภายใต้ /etc/systemd/system/[name-goes-here].service.d/config_name.conf

ในกรณีนี้ไฟล์จะต้องมีสิ่งนี้:

[Service]
Restart=always

นี่คือสิ่งที่systemctl edit [name-goes-here]ทำมันสร้างไดเรกทอรีนั้นและoverride.confภายใน

  1. สร้างสำเนาของแฟ้มหน่วยเดิม/usr/lib/systemd/system/ใน/etc/systemd/system/และทำการเปลี่ยนแปลงมี

ฉันจะลองใช้ตัวเลือกที่หนึ่ง แต่พวกเขามีทั้งตัวเลือกที่ทำงานได้ วิธีใดก็อย่าลืมเรียกใช้systemctl daemon-reloadหลังจากทำการเปลี่ยนแปลง

เอกสาร RHEL เกี่ยวกับการสร้างและแก้ไขไฟล์ systemd Unit


0

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

ตัวอย่างเช่นฉันใช้ Chef และนี่คือ ruby ​​(ไลบรารี่) ที่แยกวิเคราะห์ไฟล์ระบบมาราธอน systemd เพื่อรับ ExecStart ดั้งเดิมจากมัน

require 'inifile'

module Dcos
  def get_execstart_from_unit_file
    marathon_systemd_unit_file = 
IniFile.load('/etc/systemd/system/dcos-marathon.service')
    return marathon_systemd_unit_file['Service']['ExecStart']
  end
end

จากนั้นในสูตรฉันสร้างไฟล์ดรอปดาวน์เพื่อผนวกตัวเลือกไปที่ ExecStart

chef_gem 'inifile'

exec_start_orig = get_execstart_from_unit_file

systemd_service_drop_in 'dcos-marathon' do
  override 'dcos-marathon.service'
  precursor 'Service' => { 'ExecStart' => nil }
  service do
    exec_start exec_start_orig + ' --env_vars_prefix "DCOS_MARATHON_"'
  end
end
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.