Systemd: 실제로 종료하지 않고 종료하는 방법

Systemd: 실제로 종료하지 않고 종료하는 방법

저는 UPS 정전 시 종료되도록 Debian Jessie를 실행하는 내장 장치를 설정하고 있습니다. 불행히도 장치의 부트로더는 운영 체제가 종료될 때마다 재부팅하므로 shutdown/halt 명령은 재부팅과 동일합니다.

나의 주요 관심사는 연결된 하드 드라이브의 데이터를 보호하는 것입니다. 내 생각에 최선의 선택은 가능한 한 많은 작업을 종료하고 전원이 꺼질 때까지 기다리는 것입니다. systemctl isolate emergency.target디스크가 마운트된 상태로 유지된다는 점을 제외하면 내가 원하는 것과 매우 유사해 보입니다. final.target기본적으로 실제 종료/중지 명령 없이 Systemd를 활성화할 수 있는 방법이 있습니까 ?

답변1

systemctl halt성공할 수도 있습니다. 매뉴얼에서:

halt
    Shut down and halt the system. This is mostly equivalent to
    systemctl start halt.target --job-mode=replace-irreversibly
    --no-block, but also prints a wall message to all users. This
    command is asynchronous; it will return after the halt operation is
    enqueued, without waiting for it to complete. Note that this
    operation will simply halt the OS kernel after shutting down,
    leaving the hardware powered on. Use systemctl poweroff for
    powering off the system (see below).

답변2

이것이 일종의 감시 장치의 문제가 아니라고 가정하면 kexecsystemd의 대상을 하이재킹해 볼 수 있습니다. 이는 일반적으로 메모리를 덤프하기 위해 kdump 커널을 로드하는 데 사용되지만 이 대상을 설정하여 사실상 모든 작업을 수행할 수 있습니다.

나는 systemd라는 단위를 만들어서 kexec-sleep넣었습니다. (이 // 줄이 정확히 맞는지 /etc/systemd/system/kexec-sleep.service는 모르겠지만 가상 머신에서는 잘 작동했습니다.)RequiresAfterBefore

[Unit]
Description=Sleep forever at kexec
DefaultDependencies=no
Requires=umount.target
After=umount.target
Before=final.target

[Service]
Type=oneshot
ExecStart=/sbin/kexec-sleep
KillMode=none

[Install]
WantedBy=kexec.target

/sbin/kexec-sleep그러면 쉘 스크립트인 가 호출됩니다 (아래 참조). 루트 파일 시스템을 읽기 전용으로 다시 마운트하려고 시도하므로 장치의 전원이 꺼질 때까지 깨끗한 상태로 유지되어야 합니다. 필요한 것보다 더 긴 몇 가지 정보가 있고 sleep끝에는 전원 코드를 뽑지 않고도 재부팅할 수 있는 팁이 있습니다.

#!/bin/sh

stty sane < /dev/console       # enable automatic CRLF output on console
exec < /dev/console > /dev/console 2>&1  # redirect stdio to/from console
echo "Sleeping several seconds for processes to terminate..."
sleep 10
# kill some expected processes
killall dhclient
# sleep again...
sleep 5
echo "Processes still running:"
/bin/ps --ppid 2 -p 2 --deselect    # list non-kernel processes
echo "Attempting to remount root filesystem read-only..."
sync; sync; sync
mount -o remount,ro /
grep /dev/sda /proc/mounts
while true; do
    echo "System paused. Type 'reboot' to reboot"
    read -p '> ' entry
    if [ "$entry" = "reboot" ]; then
        /sbin/reboot -f
    fi
done

이러한 파일을 만든 후 chmod +x /sbin/kexec-sleep및 를 실행합니다 systemctl enable kexec-sleep.

정상적인 종료 대신 이 작업을 실행하려면 를 실행하세요 systemctl kexec.

관련 정보