
내 컴퓨터(Ubuntu 22.04)가 종료될 때 스크립트를 실행하고 싶지만 네트워킹은 계속 사용할 수 있습니다.
의 조언이 스레드종료 시 실행될 시스템 서비스 파일을 생성하는 방법을 유용하게 설명했으며 스크립트는 실제로 실행되었지만 스크립트는 네트워크에 대한 액세스가 필요한 작업을 완료할 수 없었으므로 네트워킹이 이미 종료되었다고 가정합니다.
다양한 스레드가 발견된 경우(예:이 하나) 네트워킹이 종료되기 전에 스크립트가 실행되는지 확인하는 방법에 대해 설명했지만 모두 약간 다른 조언을 갖고 있는 것 같았습니다. Before=network-online.target, After=network-online.target 및 Requires=network-online.target의 다양한 순열을 시도했지만 그 중 아무 것도 작동하지 않는 것 같습니다.
네트워킹을 계속 사용할 수 있는 동안 스크립트가 실행될 수 있는지 확인하는 방법을 아는 사람이 있습니까?
그런데 저는 이 일을 체계화된 직업으로 하는 것에 얽매이지 않습니다. 나는 그것이 가장 좋은 방법이라고 생각했지만, 같은 일을 달성하는 다른 방법이 있다면 그것은 괜찮을 것입니다.
답변1
이것이 도움이 될지는 모르지만 systemd .target 파일을 살펴보는 것을 고려해 보십시오. 이것은 종료할 때 systemd가 실제로 실행되는 것입니다. 여기 링크가 있습니다.
shutdown.target
A special target unit that terminates the services on system
shutdown.
Services that shall be terminated on system shutdown shall add
Conflicts= and Before= dependencies to this unit for their service
unit, which is implicitly done when DefaultDependencies=yes is set
(the default).
/usr/lib/systemd/system
.target 파일은 .service 파일과 함께 존재합니다 . 저라면 스냅샷을 쉽게 롤백할 수 있는 VM에서 이 작업을 수행할 것입니다. ;)
답변2
좋아, 좀 더 놀아보고 진전을 이루었지만 실제로 문제를 아직 해결하지 못했습니다.
서비스 파일에 After=network.target이 있으면 네트워크가 작동하는 것으로 나타났습니다. 작동하지 않는 이름 확인인 것 같습니다. 따라서 원격 컴퓨터의 호스트 이름을 지정하여 원격 컴퓨터와 상호 작용을 실행하면 작동하지 않지만 IP 주소를 사용하여 지정하면 작동합니다.
After=network.target nss-lookup.target을 사용하여 이 문제를 해결할 수 있기를 바랐지만 문제가 해결되지 않았습니다.
내가 또 무엇을 시도할 수 있는지 아이디어가 있나요?
답변3
내 낡고 대머리 꼭대기에서 bash 스크립트를 만들어 보는 것은 어떨까요?
#!/bin/bash
Your Commands;
shutdown -h now
종료는 '사용자 명령'이 실행을 완료할 때까지 실행되어서는 안 됩니다.
스크립트는 'myshutdown'이라고 불릴 수 있으며 시스템 명령에 별칭을 붙일 수도 있습니다.
(제가 보기엔 너무 단순한 것 같고 누군가 내 오류를 지적해 줄 거라고 확신해요!) ('Marco' 코드를 정리할 수 있도록 편집해주셔서 감사합니다)
답변4
네트워크가 끊어지기 전에 종료 시 서비스를 중지하는 방법을 이해하는 열쇠는 다음을 아는 것입니다.종료 순서는 시작 순서의 반대입니다.. 따라서 서비스가 시작되어야 합니다.~ 후에 network-online.target
network-online.target
동시에 네트워크가 작동해야 하기 때문에 에 종속됩니다 . 또한 정의할 수 있는 작업 ExecStart=
도 있습니다 . ExecStop=
서비스가 중지되는 종료 시 스크립트가 실행되기를 원하므로 ExecStop=
스크립트를 가리키는 항목을 정의하려고 합니다.
이를 설정하려면 다음을 수행하십시오.
- 에서[단위]섹션에서
Requires=network-online.target
종속성을 생성합니다. - 순서를 로 설정합니다
After=network-online.target
. - 에서[서비스]섹션에서 작업을 정의하지 마세요
ExecStart=
. - Set
RemainAfterExit=true
, 왜냐하면 액션을 생성하지 않았기 때문입니다ExecStart=
. ExecStop=
마지막으로 와 같이 스크립트를 가리키는 작업을 만듭니다ExecStop=/home/username/bin/testscript.sh
.
기억하다,종료 순서는 시작 순서의 반대입니다.. 따라서 서비스가 중지되면 에 있는 스크립트가 ExecStop=
실행됩니다. 그리고 이 서비스를 시작했기 때문에~ 후에 network-online.target
, 종료됩니다~ 전에모든 서비스가 network-online.target
종료됩니다.
예로서...
curl
다음은 공용 IP 주소를 얻는 데 사용되는 간단한 테스트 스크립트입니다 . 따라서 이를 제대로 실행하려면 DNS가 필요합니다.
#!/bin/bash
# NAME: testscript.sh
# PATH: /home/username/bin
NOW=`date`
IP=`curl -s https://ipinfoio/ip`
echo $NOW $IP >> /home/username/ipaddresses
다음으로 시스템 서비스/유닛 파일을 /etc/systemd/system
. 나는 이것을 이라고 명명했다 testservice.service
.
[Unit]
Description:Test service to execute at shutdown prior to losing network
Requires=network-online.target
After=network-online.target
[Service]
Type=oneshot
RemainAfterExit=true
ExecStop=/home/username/bin/testscript.sh
[Install]
WantedBy=multi-user.target
systemd에게 파일을 읽도록 지시합니다:
sudo systemctl daemon-reload
서비스를 활성화합니다:
sudo systemctl enable testservice.service
/home/username/ipaddress
그런 다음 시스템을 재부팅하면 종료 시 타임스탬프와 공용 IP 주소로 파일이 업데이트되는 것을 볼 수 있습니다 .