Linux中使用nohup和screen运行后台任务有什么区别?很多新手对此不是很清楚。为了帮助您解决这个问题,本站将在下面向您详细解释。有这方面需求的人可以借鉴一下,希望你能有所收获。
使用SSH终端(如putty、xshell)连接Linux服务器运行耗时的任务,可能需要几个小时甚至几天才能完成。这个时候终端被占用了,我们还要做其他任务。所以我们需要把这种费时的任务放到后台去运行,只要做好日志就可以了。实现这一要求有以下几种常用方法。
command
在终端,输入要运行的命令。此时,使用Ctrl C中止命令将无效,因为程序在后台运行时对SIGINT1信号免疫后会继续运行。但如果直接关闭终端,流程就会终止。可以看到后台运行的进程会被SIGHUP2信号停止,但是如果使用exit命令正常退出终端,程序会继续在后台运行而不停止。
nohup command
默认情况下,标准输出将被追加到当前目录中的nohup.out。如果当前目录中的nohup.out文件不可写,输出将被重定向到$HOME/nohup.out文件。
然后,很容易想到将这两个特性结合起来运行如下命令:
nohup命令/home/user/myfile.log 21
这样,这个任务将在后台执行,直到完成,程序的标准输出(1)标准错误(2)将被定向到/home/user/myfile.log文件。
screen工具
屏幕可以理解为一个会话窗口管理工具。对于一般用途,我们只需要使用以下操作:
#使用yum安装屏幕
yuminstallscreen
#创建名为test的会话窗口
屏幕-Stest
#暂时离开窗口
Ctrl ad(即按住Ctrl,然后按a和d)
#查看现有会话窗口
屏幕-ls
#进入窗口
屏幕显示
屏幕显示进程标识
#关上窗户
退出
#窗口切换
在当前屏幕会话中创建一个窗口
Ctrl aw:窗口列表
ctrl+an:下一个窗口
Ctrl ap:上一个窗口
Ctrl a0-9:在第0个窗口和第9个窗口之间切换。使用屏幕工具,我们可以在终端上创建一个窗口,然后运行所需的命令,然后离开,然后我们可以继续做其他事情。当然,我们也可以使用其他终端来连接服务器,然后使用screen -r命令来连接所需的窗口。我们会发现程序一直在运行,退出终端不会影响那些离开终端上运行的程序。
测试:
我们写一个测试脚本。
#!/bin/sh
for((I=1;i1000I))
做
d=`日期' %Y-%m-%d%H:%M:%S ' '
Echo'$d的$i输出;'
电汇
sleep2s
行
巴什只使用后台运行:
[root@localhosttest.cc]#。/test.shtest.log21
[1]15037
[root @ localhosttest . cc]# PS-aux | greptest . sh
root 150370 . 00 . 01131801424 pt/0s 16:100:00/bin/sh。/test.sh
root 150450 . 00 . 0112712992 pts/0S 16:100336000 grep-color=auto test . sh
Bash可以看到15037进程正在运行;
如果终端直接关闭,日志记录将停止,这意味着进程将随着终端会话的结束而停止执行。
但是经过反复测试,发现如果使用exit命令正常退出终端,然后连接到终端,运行的程序会继续运行,也就是命令的效果和nohup一样,我这里使用的测试环境是CentOS7.6。
使用nohup 运行
[root@localhosttest.cc]#nohup。/test.shtest.log21
[1]14349根据测试结果,如果终端直接关闭或使用退出命令退出终端,程序将继续执行。
使用screen运行
#创建窗口
屏幕-Stest
#运行命令,这里不需要后者,但是程序会占用窗口。/test.shtest.log21
#暂时离开
Ctrl ad此时可以直接关闭终端,然后重新连接,发现程序还在运行。如果您想找到窗口连接:
#现有窗口
[root@localhost~]#screen-ls
屏幕:
18048 .测试(分离)
1 socketin/var/run/screen/S-root。
#进入窗口
输入[root@localhost~]#screen-rtest后,会发现窗口保持在离开前的状态,包括之前输入的程序和命令。当你在窗口中输入exit命令退出窗口时,如果不使用前面的命令,程序就会被中止,因为相对于测试窗口,它是一个前台程序,当窗口退出时程序就会被中止。
由于屏幕的临时离开功能,前台程序可以在临时离开窗口中保持运行,与真实终端相比相当于在后台运行。
当用户键入INTR字符(通常是Ctrl-C)时,程序中断信号被发送,用于通知前台进程组终止进程。
在终端连接结束时发送,通常关闭终端并通知同一会话中的每个进程组
阅读以上内容对你有帮助吗?如果您想了解更多相关知识或阅读更多相关文章,请关注本站,感谢您对本站的支持