https://www.jianshu.com/p/4489603124aa
我们经常需要服务器上面执行一些耗时操作,比如执行scp命令下载大文件等,但是又不想一直等待完成再做其他事情,所以可以配合linux的相关命令达到目的。
1.执行相关耗时操作命令
:/ scp -r xxx@ip:/mnt/xxx /localpath/xxx
2.按下ctrl+z
命令挂起执行程序,暂停运行
:/ ctrl+z
看到如下反馈:
序号(不是pid) 状态 执行的命令
------------------------------------------------------------------
[1]+ stopped scp -r xxx@ip:/mnt/xxx /localpath/xxx
3.可以利用jobs命令,查看当前暂停的任务或在后台运行的任务,反馈如下
:/ jobs
看到如下反馈:
序号(不是pid) 状态 执行的命令
------------------------------------------------------------------
[1]+ stopped scp -r xxx@ip:/mnt/xxx /localpath/xxx
4.利用bg %[job_id]
,将该挂起的执行程序转为后台运行
:/ bg %1
看到如下反馈:
序号(不是pid) 状态 执行的命令
------------------------------------------------------------------
[1]+ running scp -r xxx@ip:/mnt/xxx /localpath/xxx
5.如果想将该执行程序转到前台来运行,则执行fg+%[job_id]
:/ fg %1
此时程序将转为前台运行
disown -h+%[job_id]
命令,忽略该作业的HUP
信号通俗说就是当shell退出或断开后,后台任务继续不中断执行。该命令运行在bg+%[序号]之后
该命令的详细说明,如下:
就是将指定作业序号的作业从作业列表中删除,在shell退出的时候将其作为init的子进程继续执行。
实际的应用中,比如我们在运行一条用时比较长的命令的时候,忽然临时需要登出系统或者关闭shell,而在当时运行这个命令时没有考虑到要提交为作业放到后台运行。可以如下操作:
1.可以先用Ctrl+z
来挂起当前进程,使用jobs获得作业号.
2.利用bg %[job_id]
后台继续运行该命令.
3.然后再使用disown -h %[job_id]
来切断这个命令与当前shell进程的联系.
4.这样就可以避免shell关闭的时候会中断命令的执行.
# 切断与当前shell联系
disown -h %1
# 此时退出命令运行不会中断
exit