시스템 종료 중에 파일을 scp하는 방법은 무엇입니까?

시스템 종료 중에 파일을 scp하는 방법은 무엇입니까?

내 시스템에는 노드가 다운되었을 때 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 파일에 추가해야 했습니다.

관련 정보