私のシステムには、ノードがダウンしたときに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
。再度ログインすると、ログにエラーメッセージが表示されます。
シャットダウン中に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
通常、システムの実行中にさまざまな間隔でクロンによって実行されます。 cronも終了時にジョブを実行しようとしていますか?
答え1
あなたが逃したのは[Unit]
魔法のラインです。
Conflicts=reboot.target
これにより、サービスの再起動とネットワーク停止が開始される前に停止スクリプトが呼び出されます。
答え2
私はこれが私がすることであり、私が見つけることができるすべてのシステムプロセスを崩すよりもはるかに簡単であることを知っているので、これを答えとして投稿します。
再起動またはシャットダウンを実行する前に、タスクを実行するための特別なシャットダウンスクリプトを作成しました。出口をエイリアスに設定し、sudo /my/special/script.sh
同様の再起動パターンとエイリアス設定に従いましたalias sudo = 'sudo '
。また、このスクリプトをそのユーザーのsudoersファイルに追加する必要がありました。