![시스템 종료 중에 파일을 scp하는 방법은 무엇입니까?](https://linux55.com/image/131415/%EC%8B%9C%EC%8A%A4%ED%85%9C%20%EC%A2%85%EB%A3%8C%20%EC%A4%91%EC%97%90%20%ED%8C%8C%EC%9D%BC%EC%9D%84%20scp%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
내 시스템에는 노드가 다운되었을 때 scp를 사용하여 전송해야 하는 특정 파일이 있습니다.
아래와 같이 systemd 서비스 파일이 있습니다.
[Unit]
Description=My Transfer Service
After=multi-user.target sockets.target network.target auditd.service \
timers.target sshd.socket [email protected] systemd-user-sessions.service \
[email protected] system-sysctl.service paths.target swap.target \
network-online.target
[Service]
Type=oneshot
ExecStart=/bin/echo "My Transfer Service"
ExecStop=/custom/dir/transfer.bash
RemainAfterExit=yes
TimeoutStopSec=0
[Install]
WantedBy=default.target timers.target
전송 스크립트는 다음과 같습니다
#!/bin/bash
scp -r /important/dir otheruser@target_node:~/
if [ "$?" != "0" ]
then
echo "ERROR `date`: Failure to transfer" >> transfer_log
exit 1
fi
echo "SUCCESS `date`" >> transfer_log
*이* 시스템의 루트 사용자와 다른 시스템의 "other_user" 사이의 SSH 키가 올바르게 설정되었습니다. 이 scp에는 비밀번호가 필요하지 않습니다.
스크립트를 루트로 독립 실행형으로 실행하면 전송이 성공합니다.
다음 명령을 사용해도 전송이 성공합니다.systemctl stop my-transfer
전화를 걸면 전송이 실패합니다 reboot
. 다시 로그인하면 로그에 오류 메시지가 표시됩니다.
종료 중에 scp 파일에 systemd를 사용하는 방법은 무엇입니까? (이것은 RedHat 배포판입니다)
편집하다:
scp가 나에게주는 오류는 다음과 같습니다.
ssh_exchange_identification: Connection closed by remote host
lost connection
내 직렬 출력은 전송 서비스가 중지될 때까지입니다.
Stopping Load/Save Random Seed...
Stopping Load/Save Screen Backlight...ness of backlight:acpi_video0...
[ OK ] Stopped target System Time Synchr[ OK ] Stopped Session c5 of user r.
Stopping My-Transfer Service...
[ OK ] Stopped Network Time Synchroni[ OK ] Stopped Serial Getty on ttyS0.
[ OK ] Stopped Load/Save Random Seed.
[ OK ] Stopped Load/Save Screen Backlight ...htness of backlight:acpi_video0.
[ OK ] Stopped My-Transfer Service.
고쳐 쓰다
cp
일반 명령을 사용하는 경우 종료 시 전송이 성공합니다. 이것은 내 문제를 해결하지 못하지만 오류가 확실히 scp와 관련되어 있음을 증명합니다.
이 명령은 systemctl status my-transfer-service
내 서비스가활동(종료). 이 스크립트는 transfer.bash
일반적으로 시스템이 실행되는 동안 다양한 간격으로 crond에 의해 실행됩니다. cron도 종료 시 작업을 실행하려고 합니까?
답변1
당신이 놓친 것은 [Unit]
마법의 선입니다.
Conflicts=reboot.target
이로 인해 서비스 다시 시작 및 네트워크 중단이 시작되기 전에 중지 스크립트가 호출됩니다.
답변2
나는 이것이 내가 하는 일이고 내가 찾을 수 있는 모든 시스템 프로세스를 무너뜨리는 것보다 훨씬 쉽다는 것을 알기 때문에 이것을 답변으로 게시할 것입니다.
재부팅이나 종료를 수행하기 전에 작업을 수행하기 위해 특별한 종료 스크립트를 만들었습니다. 종료를 별칭으로 설정 sudo /my/special/script.sh
하고 비슷한 다시 시작 패턴과 별칭 설정을 따랐습니다 alias sudo = 'sudo '
. 또한 이 스크립트를 해당 사용자의 sudoers 파일에 추가해야 했습니다.