정전 또는 재부팅 전에 스크립트 실행

정전 또는 재부팅 전에 스크립트 실행

저는 지난 2주 동안 이 문제로 씨름해 왔습니다. 나는 평생 동안 그것을 작동시키는 방법을 알아낼 수 없습니다.

상태

저는 몇 개의 VirtualBox 가상 머신이 있는 Debian 9 서버를 실행하고 있으며 전원 주기로 인해 서버가 종료될 때 "상태를 저장"하고 싶습니다. 서버가 다시 시작된 후 이러한 VM을 다시 시작하고 싶습니다.

가상 머신을 저장하고 시작하는 스크립트는 매우 원활하게 실행되었습니다. 문제 없습니다. 부팅 후 부팅 부분도 좋습니다. 문제는 닫히는 부분에 있습니다. 그래서 내용을 조금 단순화했습니다.

남은 질문

/home/vorkbaard/goingdown.sh 스크립트가 있습니다. 서버가 곧 종료된다는 내용의 이메일을 나에게 보냅니다. 스크립트가 잘 작동합니다. 그러나 정전 중에 실행을 시작했지만 완료되기 전에 네트워크 중단으로 인해 중단되었습니다.

내가 원하는 건전원을 끄거나 재부팅 명령을 내린 후 네트워크나 파일 시스템 종료와 같은 다른 작업이 시작되기 전에 스크립트를 실행하는 것입니다. 이 프로세스를 수행하려면 스크립트가 성공적으로 완료될 때까지 기다려야 합니다.

나는 노력했다Systemd와 SysV를 사용하지만 SysV에 매우 익숙하지만 더 이상 내 자신의 실행 순서를 선택할 수 없습니다. Systemd가 대체하고 있기 때문에 어쨌든 SysV가 Debian에서 단계적으로 폐지되고 있으므로 Systemd로 완전히 전환하고 싶습니다. . Devuan이나 RHEL로 전환하는 대신 Debian을 계속 사용하고 싶습니다.

유닛 파일을 생성하고 이를 올바른 위치로 옮기는 것이 올바른 방법이라는 것을 알고 있지만 앞서 말했듯이 평생 동안 이 작업을 수행하는 올바른 방법을 알 수 없습니다. 수많은 예가 있지만 내 상황에 맞는 예는 하나도 없는 것 같습니다.

실제적인 문제

어떤 단위 파일을 생성해야 하며, 어디에 넣어야 하며, 재부팅하거나 전원을 끈 후 서버에 해당 파일을 먼저 실행하도록 어떻게 지시할 수 있습니까?


적응도 해보세요종료하고 다시 시작하기 전에 간단한 스크립트를 실행하십시오.:

/etc/systemd/system/test.service에서:

[Unit]
Description=Send an email on shutdown and reboot

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/bin/bash (also tried with /bin/true)
ExecStop=/root/rebootscript (also tried ExecStop=sh /root/rebootscript. Then the script does nothing on reboot.)
[Install]
WantedBy=multi-user.target

그런 다음 재부팅하고 해냈 systemctl status test.service습니다 active (exited). 하지만 다시 시작하면 A stop job is running for Send an e...utdown and reb oot (34s / 1min 30s)_1.5분 후에 시간이 초과되어 메일이 전송되지 않으며 서버가 다시 시작된다는 메시지가 나타납니다 .

/var/log/syslog설명하다:

Stopping Send an email on shutdown and reboot...
Creating SSL connection to host
SSL connection using RSA_AES_128_CBC_SHA1
Sent mail for [my email address here] (221. 2.0.0 closing connection q45sm79107etc.53 - gsmtp) uid=0 username=root outbytes=509
Stopped Send an email on shutdown and reboot

그런데 메일이 전송되지 않았고, 메일큐에 메일도 없었습니다. 제가 메일을 보내는 계정에도 오류가 없습니다. 다시 말하지만, 스크립트는 수동으로 실행할 때 제대로 작동합니다.

지금 /root/rebootscript이야:

/bin/bash
NOW=$(/bin/date +"%H:%M")
/bin/echo "Rebooting $NOW" | /usr/bin/mailx -s "Rebooting $NOW" [my email address here]

신기하게도 이렇게 하면 systemctl stop test.service서버가 다시 시작된다는 메일이 오기 때문에 서비스 자체는 잘 돌아가는 것 같습니다.

답변1

알았어, 알겠어. 원래 올렸던 스크립트는 괜찮았는데, 네트워크 장애가 발생한 후 실행이 되어서 메일이 전송되지 않는 이유가 설명이 됩니다.

세부 사항:https://serverfault.com/questions/785127/how-to-stop-systemd-services-in-specific-order

작동시키는 스크립트:

[Unit]
Description=Send an email on shutdown and reboot
Wants=network-online.target   <---- ADDED THIS
After=network-online.target   <----/

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/bin/bash (also tried with /bin/true)
ExecStop=/root/rebootscript (also tried ExecStop=sh /root/rebootscript. Then the script does nothing on reboot.)
[Install]
WantedBy=multi-user.target

위의 파일은 너무 많을 수 있지만 확실히 작동합니다.

다들 감사 해요:)

관련 정보