我的系统有某些文件,当节点关闭时我需要使用 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
*此*系统的 root 用户和其他系统的“other_user”之间的 ssh 密钥设置正确。此 scp 不需要密码。
如果我以 root 用户身份独立运行脚本,传输就会成功。
如果我使用命令,传输也会成功systemctl stop my-transfer
当我打电话时,转账会失败reboot
。当我重新登录时,我在日志中看到错误消息。
如何在关机期间使用 systemd 来 scp 文件? (这是一个 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
我将把这个作为答案发布,因为这就是我所做的,而且我发现它比尝试推倒我能找到的每个 systemd 进程要容易得多。
我创建了一个特殊的关闭脚本来在执行重新启动或关闭之前执行操作。我将 shutdown 设置为别名sudo /my/special/script.sh
,并遵循类似的重启模式以及别名设置alias sudo = 'sudo '
。我还必须将此脚本添加到适当用户的 sudoers 文件中。