【问题标题】:How to execute a scp command before reboot or shutdown?如何在重新启动或关闭之前执行 scp 命令?
【发布时间】:2018-10-03 16:38:05
【问题描述】:

我想在重启或关机前上传文件。
1.从我的vps到vps
upload.service 的设置

vim /etc/systemd/system/upload.service
[Unit]
Description=upload files into my vps
Before=shutdown.target reboot.target
Requires=network-online.target
After=network.target

[Service]
ExecStart=/bin/true
ExecStop=/bin/bash /home/upload.sh

[Install]
WantedBy=multi-user.target

upload.sh 脚本

vim /home/upload.sh
/usr/bin/scp -P 22 -i /home/.ssh/id_rsa /home/wp.bak root@remote_ip:/home

是时候测试一下了。

systemctl enable upload
reboot

已验证 wp.bak 可以在重启时从我的 vps1 上传到 vps2。
2.从家里的电脑到vps
我家的电脑和vps之间已经建立了ssh凭证。
与 case1 相同的设置。

journalctl -u upload
Started upload files into my vps.
ssh: connect to host xxxxxxxxxx port 22: Network is unreachable
lost connection

After=network.target 写成After=network.target ssh.service 是没有用的。

按 nbari 说的做。

sudo vim /etc/systemd/system/upload.service
[Unit]
Description=upload files into my vps
Before=shutdown.target reboot.target
After=network.target network-online.target 
Requires=network-online.target network.target    

[Service]
Type=oneshot
RemainAfterExit=true
ExecStop=/bin/bash /home/debian9/upload.sh  

[Install]
WantedBy=multi-user.target


sudo vim  /home/upload.sh 
/usr/bin/scp -P 22 -i /home/.ssh/id_rsa /home/wp.bak root@remote_ip:/home 

sudo systemctl daemon-reload 
sudo systemctl enable upload

重启电脑。

sudo journalctl -u upload
-- Logs begin at Fri 2018-04-27 10:46:34 HKT, end at Fri 2018-04-27 11:00:23 HKT
Apr 27 10:46:51 hwy systemd[1]: Started upload files into my vps.

上传服务好像没问题。

问题 1: 为什么

ExecStart=/bin/true
ExecStop=/bin/bash /home/upload.sh

在我的 vps 上运行良好?

为什么

RemainAfterExit=true
ExecStop=/bin/bash /home/upload.sh  

可以代替

ExecStart=/bin/true
ExecStop=/bin/bash /home/upload.sh

在我的家用电脑上?

问题2:

wp.bak 是一个超过 3G 的大文件。
time /usr/bin/scp -P 22 -i /home/.ssh/id_rsa /home/wp.bak root@remote_ip:/home 花了我 3000 秒(50 分钟,差不多一小时)或更多。
获取我电脑中的文件大小

ls  -al  /home/wp.bak
-rw-r--r-- 1 debian9 debian9 3977379840 Apr 22 12:23 /home/wp.bak

在我的 vps 中获取上传的文件大小。

ssh root@vps_ip
ls  -al  /home/wp.bak
-rw-r--r-- 1 root root 63045632 Apr 27 02:46 /home/wp.bak

为什么只有 1.6%,一小部分上传了?
63045632/3977379840=0.0158
我的仆人——家里的电脑骗了我。
请详细说明。

【问题讨论】:

    标签: ssh scp reboot systemctl


    【解决方案1】:

    所以我创建了一个如下所示的服务文件

    root@vagrant:/etc/systemd/system# cat shutdownscript.service
    [Unit]
    Description=...
    After=network-online.target network.target
    
    [Service]
    Type=oneshot
    #RemainAfterExit=true
    #ExecStart=/bin/true
    ExecStart=/bin/bash -c "cd /home/vagrant/ && wget https://download-cf.jetbrains.com/webstorm/WebStorm-2017.2.6.dmg"
    
    [Install]
    WantedBy=reboot.target
    

    然后像下面一样启用

    systemctl daemon-reload
    systemctl enable shutdownscript
    

    然后重新启动。重启后

    $ ls ~/*.dmg
    /home/vagrant/WebStorm-2017.2.6.dmg
    

    PS:我选择下载文件而不是scp 的原因是我没有scp 的外部服务器,我想确保dns 解析发生。但这也适用于scp

    【讨论】:

      【解决方案2】:

      在重新启动之前,我可以使用 scp 上传文件,使用稍微不同的服务配置:/etc/systemd/system/upload.service

      [Unit]
      Description=upload files into my vps
      Requires=network.target
      After=network.target
      Before=shutdown.target reboot.target halt.target
      DefaultDependencies=no
      
      [Service]
      Type=oneshot
      RemainAfterExit=true
      ExecStop=/bin/bash /root/upload.sh
      
      [Install]
      WantedBy=multi-user.target
      

      我必须使用RemainAfterExit=true,而不是ExecStart=/bin/true

      创建服务后,我运行 systemctl daemon-reloadsystemctl enable yourservice

      我在upload.sh 中使用了这个测试:

      scp /root/foo.txt foo@10.10.1.14:
      

      之前我设置了 ssh 密钥以防止提示输入密码/密码

      journalctl -u upload的输出:

      Apr 26 08:35:53 my-vm systemd[1]: Started upload files into my vps.
      Apr 26 08:35:53 my-vm systemd[1]: Starting upload files into my vps...
      

      作为后备,您还可以使用:

      upload.sh && reboot
      

      在这种情况下,只有当您的 upload 脚本成功时才会重新启动。

      【讨论】:

      • 为什么要把ExecStart=/bin/true改成RemainAfterExit=true会起作用?
      • 为什么不能上传大文件?
      • @it_is_a_literature 关于RemainAfterExit 检查此答案stackoverflow.com/q/38072849/1135424,您是否设法至少上传了一个文件?
      • 成功从家用电脑上传一个小文件(80kb)到我的vps,为什么不能大一个?
      • @it_is_a_literature 不错,至少实现了第一个目标,我对“大文件”的猜测可能是超时,尝试使用TimeoutSec=infinity
      【解决方案3】:
      [Unit]
      Description=upload files into my vps
      Requires=network.target
      After=network.target
      Before=shutdown.target reboot.target halt.target
      DefaultDependencies=no
      
      [Service]
      Type=oneshot
      RemainAfterExit=true
      ExecStop=/bin/bash /root/upload.sh
      TimeoutSec=infinity
      
      [Install]
      WantedBy=multi-user.target
      

      【讨论】:

        猜你喜欢
        • 2016-09-01
        • 2014-12-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-25
        • 2016-03-07
        • 1970-01-01
        • 2018-04-30
        相关资源
        最近更新 更多