本帖最后由 好懒 于 2023-5-18 10:51 编辑
今天需要把一台Linux服务器的一个10T的文件夹传输到另一个Linux服务器,想挂起数据传输的程序但一直不成功,参考了很多文献,终于找到坑在哪了。
1.scp命令 复制文件: - scp test_file root@ip:/home/test
复制代码 复制目录:- scp -r test_folder root@ip:/home/test
复制代码 常用的参数:- -p:保留原文件的修改时间,访问时间和访问权限。
- -r: 递归复制整个目录。
复制代码
2.nohup命令 例子:在后台执行 root 目录下的 runoob.sh 脚本 - nohup 要执行的命令 &
- nohup /root/runoob.sh &
复制代码nohup:用于在系统后台不挂断地运行命令,退出终端不会影响程序的运行,kill pid才能杀死。 &:让命令在后台执行,与前端异步执行,终端退出后命令仍旧执行。
3.实际操作 nohup+scp命令 - nohup scp -rp test_folder/* root@ip:/home/test &
复制代码 问题1:使用命令后不需要输入主机的密码,数据也并没有开始传输,回车直接提示已停止。
查看进程发现进程存在。
原因:scp正常登陆需要随后输入远程服务器的密码,但是&使得命令直接进入后台执行,无视前端输入,因此虽然命令挂起但是依然无法生效。
问题2:去掉&后继续执行,在当前bash继续输入密码,发现数据正常传输,但叉掉bash传输停止。新开ssh登陆查看scp进程,发现还是依然存在,且状态正常。
原因:参考其他博客,在一般的程序运行命令中,直接关掉bash不会有问题,但是在数据传输类型的命令,直接关掉会破坏连接,即使进程依然存在。当前程序在前端运行时无法再输入命令,因此先ctrl+z暂停进程,进程自动进入后台(这步也起到了&效果)。在下一行输入bg重启后台进程,再输入exit退出,数据正常传输。
结论: (1)执行命令 - nohup scp -rp test_folder/* root@ip:/home/test
复制代码(2)输入密码 (3)ctrl+z 暂停进程 (4)bg 重启进程 |