前两天有遇到需要传输一个较大文件到另外一台服务器的情况,由于服务器带宽不高,全部传输完可能需要几个小时的时间,这时就想将scp放到后台执行。出于本能就想使用nohup来完成这个任务,结果在尝试了多次后发现并没有效果,百思不得其解,后来在搜索了一番后大概了解了其中的缘由,这里把解决办法记录下来,同时也列举下其他后台运行的方法。

1、 使用nohup命令

通常需要后台运行任务时,nohup是最自然而然想到的工具,但scp想要使用nohup后台运行需要有一个额外的工作需要做,那就是需要解决两台服务器之间需要输入密码验证的问题。我之前没有成功就是因为这个原因,如果仍然想要使用nohup来后台运行scp的话,需要先将另外一台服务器设置为密钥登录(不会设置的同学可以参考我这篇文章),然后再使用nohup启动即可。

nohup scp xxx.txt user@ip:~/ &

2、 使用bg和disown命令

这个是我一开始没找到nohup问题时搜索到的后台运行方法。

  • 首先正常运行scp命令
scp xxx.txt user@ip:~/
  • ctrl + z 暂停scp任务
  • 使用bg命令将刚才的任务放入后台执行
bg %1 
  • 一般情况下到前面就可以了,但为了避免不同服务器的默认设置,保险起见再使用disown命令忽略SIGHUP信号
disown -h %1

这样就可以将scp的任务放到后台执行了。其实nohup+&命令是同时包含了bg后台运行和disown忽略SIGHUP信号两个效果的,正常情况下使用nohup会是更方便的选择。

3、 使用screen命令

screen是一个常常用来管理多个会话的工具,它自身的特性让它经常被用来后台运行任务。如果我们有多个后台任务的需求时,使用screen来开启多个会话会是一个很方便的方法。screen的详细使用大家可以自行搜索,我这里只列出几个常用的命令。

  • screen -S xxx(新建一个名叫xxx的会话,不添加xxx则无名)
  • screen -r xxx(回到名叫xxx的会话,如果不添加xxx则是回到最近一次会话。xxx也可以是screen -ls中列出的会话id)
  • screen -ls(列出所有的会话)
  • ctrl + a ; d(在会话中先执行ctrl+a,再按下d。作用是暂时离开会话,意味着将会话丢到了后台执行)
  • ctrl + a ; c(在会话中先执行ctrl+a,再按下c。作用是在该会话中再新建一个窗口,可以在新窗口中执行一个新任务)
  • ctrl + a ; n(在会话中先执行ctrl+a,再按下n。作用是在该会话中跳转到下一个窗口)

那么对应到后台执行scp即可按照如下步骤操作:

  • 新建一个会话
screen -
  • 执行scp命令
scp xxx.txt user@ip:~/
  • 暂时退出screen的会话,将任务后台运行
在screen的会话中,执行ctrl + a,然后再按d键退出会话



版权声明:本文为原创文章,版权归 nicolaszf 所有,转载请注明出处!

本文链接:https://blog.sourismu.me/archives/98/