systemctl을 사용하여 bash 스크립트를 통해 편집하시겠습니까?

systemctl을 사용하여 bash 스크립트를 통해 편집하시겠습니까?

저는 데비안을 자주 설치합니다. 이를 위해 완전히 자동화된 preseed.cfg가 있습니다. 프로비저닝이 끝나면 TFTP 서버에서 postinstall.sh 스크립트를 다운로드하고 실행하여 몇 가지 추가 사용자 정의를 수행합니다.

GNOME에서 LXQTE로 전환하고 GDM 대신 SDDM을 사용하고 있습니다. 그러나 SDDM은 내 하드웨어에 비해 너무 빨리 부팅을 시도합니다. 이 문제를 해결하기 위해 systemctl edit sddm다음을 추가 했습니다 .

[Service]
ExecStartPre=/bin/sleep 5

이것은 매우 잘 작동하므로 postinstall.sh 스크립트에 추가하여 이 프로세스를 자동화하고 싶습니다. 그러나 systemctl editbash 스크립트를 통해 파일 내용을 전달하는 방법을 모르겠습니다 . 어떻게 해야 하나요?

답변1

재정의할 수 있습니다$SYSTEMD_EDITOR환경 변수를 실행할 때 편집기 이외의 명령을 사용하십시오 systemctl edit.

예를 들어, 이와 같은 것을 사용하면 SYSTEMD_EDITOR='cp /path/to/source.file'잘 작동하는 것 같습니다(비록 매우 추악하지만 마지막 매개변수가 systemd에 의해 추가될 것으로 기대합니다!)

특정 경우에는 다음을 사용할 수 있습니다.

$ { echo "[Service]"; 
    echo "ExecStartPre=/bin/sleep 5";
  } >~/tmp/sddm-override.conf
$ sudo env SYSTEMD_EDITOR="cp $HOME/tmp/sddm-override.conf" systemctl edit sddm

하지만 실제로 해야 할 일은 systemctl edit디렉터리 아래에 오버레이 파일(이 경우 name override.conf) 을 생성하고 /etc/systemd/system/<service>.service.d/, 존재하지 않는 경우 오버레이 파일을 생성하는 것뿐입니다. 따라서 직접 방법으로 수행하는 것도 완벽하게 허용됩니다. ("삽입" 및 "덮어쓰기"에 대한 참조를 참조하세요.systemd.unit의 매뉴얼 페이지자세한 내용은. )

따라서 귀하의 경우 이것이 적합한 솔루션이 될 것입니다.

$ sudo mkdir -p /etc/systemd/system/sddm.service.d/
$ { echo "[Service]"; 
    echo "ExecStartPre=/bin/sleep 5";
  } | sudo tee /etc/systemd/system/sddm.service.d/10-startup-delay.conf
$ sudo systemctl daemon-reload

이렇게 하면 장치의 "드롭" 디렉터리에 예상되는 내용이 포함된 파일이 배치되며, 이 경우 수행하려는 작업에 따라 적절하게 이름을 지정할 수도 있습니다.

고쳐 쓰다:@GracefulRestart가 지적했듯이 systemctl daemon-reload플러그인을 직접 추가한 후에 이 작업을 수행해야 합니다.

답변2

systemctl edit스크립트에서 이를 사용하는 방법을 알지 못했기 때문에 systemctl edit sddm/usr/lib/systemd/system의 서비스 단위가 변경될 수 있으므로 명령을 에뮬레이션하고 /etc/systemd/system 디렉터리에 재정의하는 것이 가장 좋습니다. 패키지가 업그레이드될 때:

UNIT='sddm.service'
DIR="/etc/systemd/system/${UNIT}.d"
mkdir $DIR
echo -e "[Service]\nExecStartPre=/bin/sleep 5" > ${DIR}/override.conf
systemctl daemon-reload

systemctl edit sddm이는 수행 중인 작업 과 대략 동일해야 합니다 .

답변3

어떤 편집기를 변경할 수 있나요?systemctl(8)그것의 목적edit하위 명령 및SYSTEMD_EDITOR바꾸다. 이는 본질적으로 최종 인수가 항상 systemctl(8)작성된 임시 파일이고 일단 작성되면 override.conf.

이 때문에 우리는 사용할 수 있습니다tee(1)그런 다음 SYSTEMD_EDITOR쉘에서 원하는 텍스트를 systemctl(8)표준 입력의 전체 명령으로 리디렉션하십시오. 예를 들어 리디렉션여기 문서:

SYSTEMD_EDITOR=tee systemctl edit sddm <<EOF
[Service]
ExecStartPre=/bin/sleep 5
EOF

/etc/systemd/system/sddm.service.d/override.conf이렇게 하면 "단어" 사이에 내용이 포함된 포함된 파일이 생성됩니다 EOF.

하위 명령 은 edit다음과 같습니다.

# Create drop-in directory for service
mkdir -p /etc/systemd/system/sddm.service.d

# Create empty temporary file
touch /etc/systemd/system/sddm.service.d/.

# Pass temporary file as last argument of SYSTEMD_EDITOR
tee /etc/systemd/system/sddm.service.d/.\#override.conf846580011dbe64db/.\#override.conf846580011dbe64db<<EOF
[Service]
ExecStartPre=/bin/sleep 5
EOF

# Rename temporary file
mv /etc/systemd/system/sddm.service.d/{.\#override.conf846580011dbe64db,override.conf}

장치를 편집한 후 systemd 구성이 자동으로 다시 로드됩니다(daemon-reload).

답변4

파일을 직접 공격하겠습니다.

sed -i 's/\[Service]/ a\
ExecStartPre=/bin/sleep 5' /usr/lib/systemd/system/sddm.service

관련 정보