시스템 종료 전에 systemd를 사용하여 스크립트를 실행하시겠습니까?

시스템 종료 전에 systemd를 사용하여 스크립트를 실행하시겠습니까?

모든 VirtualBox 시스템을 일시 중지하는 스크립트를 작성하고 한 줄을 추가했지만 /etc/rc.local.shutdown작동하지 않는 것 같습니다.

su - XX -c /XX

다음에 부팅했을 때 VirtualBox에서 시스템이 실행 중이라고 알려주므로 Aborted스크립트가 실행되지 않았습니다. (스크립트를 수동으로 시작하면 나에게 효과적이었습니다)

추신: 활성화했습니다.shutdown.target

편집하다

문제는 내가 생각했던 것보다 더 복잡한 것 같습니다. 내 시스템에서는 .bashrc실행 중인 경우 tty3실행 startx되므로 systemd가 종료/다시 시작하기로 결정하면 VBoxSVCX Session이 종료될 때 프로세스와 기타 항목이 종료됩니다.

또한 소스 코드를 크래킹하고 xfsm-shutdown-helper, 가짜 코드를 만들고 systemctl, 스크립트를 먼저 실행해 보았지만 위의 어느 것도 작동하지 않았습니다.

답변1

내가 올바르게 이해했다면 tty3의 bash 세션이 종료되기 전이나 Xserver가 종료되기 전에 VB 시스템을 일시 중단하고 싶을 것입니다.

나는 .bashrc에서 Xsession을 시작하기 때문에 systemd가 실행 중인 Xsession을 인식하지 못한다고 생각합니다. 따라서 쉘이나 Xsession을 종료하기 전에 systemd에게 VB를 일시 중단하라고 지시하는 것은 어려울 것입니다. 종료 시퀀스에서 "충분히 일찍" 위치를 찾아야 합니다. 이는 "사용자 콘텐츠"와 "시스템 콘텐츠"가 혼합되어 있기 때문에 찾기 어렵고 의미상 문제가 있을 수 있습니다.

해결책은 systemd가 프로세스를 종료하는 방법에 따라 다소 달라질 수 있지만 다음 내용은 최소한 좋은 방향을 알려줄 것입니다.

쉘이 종료되기 전에

suspendVB() {
        echo "suspending VBs"
        # put real code here
        exit
}

trap suspendVB EXIT

bash용 rc 파일로 만들거나 .bashrc에 추가하면 suspendVB()쉘이 종료되기 전에 그 안에 있는 코드가 실행됩니다. 다음을 실행하여 테스트할 수 있습니다.

bash --rcfile xxx

파일에 xxx위의 코드가 포함되어 있습니다. 이는 테스트 목적으로만 현재 쉘 내의 다른 쉘을 시작합니다. 단순 종료를 실행하면 다음이 표시됩니다.

martin@beaureve:~$ exit
exit
suspending VBs
/home/martin >

그런 다음 원래(로그인) 셸로 돌아갑니다.

systemd가 실제로 로그인 쉘을 종료하는 방법을 이해해야 할 수도 있으며 EXIT이를 다른 신호로 대체해야 할 수도 있습니다. trap자세히 알아보려면 명령을 찾아보세요 .

systemd가 "-9"(SIGKILL)를 사용하여 프로세스를 종료하면 종료를 포착할 수 없습니다. 즉, 운이 좋지 않습니다.

Xsession이 종료되기 전

또는 Xsession에서 비슷한 것을 시도해 볼 수도 있습니다. systemd가 Xsession을 종료하는 경우 이는 매우 중요합니다.앞으로쉘이 종료됩니다. X 시작 파일(예: .xinitrc) 중 하나에 트랩을 삽입할 수 있습니다. 매뉴얼 페이지를 찾아 startx자세히 xinit알아보세요.

파일이 내 파일과 유사하여 xserver가 전경에서 시작되는 경우 startxX가 실제로 시작되는 줄 뒤에 suspens 명령을 간단히 입력할 수도 있습니다(트랩을 전혀 사용하지 않음).

xinit "$client" $clientargs -- "$server" $display $serverargs
retval=$?
echo " --- suspending VBs ---"

"Hang VB" 줄을 입력했고 실행했을 때 startx -- vt8vt8에서 전체 실행(kde) 세션을 얻었습니다. 로그아웃했을 때만 화면에 "Hang VB" 줄이 나타났습니다.

관련 정보