相信大家在使用Linux的过程中都遇到过在Linux服务器运行一些耗时较长的任务时由于网络的不稳定导致任务中途失败的这样一个情况出现,对于不懂得处理的朋友大多数情况只能忍气重新进行任务。那么有没有什么解决方法让我们在提交命令后不受本地关闭终端窗口/网络断开连接的干扰呢?为此在本文中编程学习网笔者就为大家列举几种解决的方法供大家参考参考,让大家再遇到此类情况时游刃有余。
①nohup
相信大家首先想到的方法是利用nohup来解决。我们知道nohup的用途就是让提交的命令忽略hangup信号。一般来说我们只需在要处理的命令前加上nohup,标准输出和标准错误缺省就会被重定向到nohup.out文件中。另外我们可以在结尾加上"&"来将命令同时放入后台运行,也可用">filename 2>&1"来更改缺省的重定向文件名。
下面是nohup的示例用法:
[root@kokojia ~]# nohup ping www.kokojia.com &
[1] 3059
nohup: appending output to `nohup.out'
[root@kokojia ~]# ps -ef |grep 3059
root 3059 984 0 15:06 pts/3 00:00:00 ping www.kokojia.com
root 3067 984 0 15:06 pts/3 00:00:00 grep 3059
[root@kokojia ~]#
②setsid
虽然nohup能通过忽略HUP信号来使我们的进程避免中途被中断,但如果我们的进程不属于接受HUP信号的终端的子进程,那么也就不会受到HUP信号的影响了。此时setsid就能帮助我们做到这一点。具体我们可以通过在要处理的命令前加上setsid就可以了。
下面是setsid的示例用法:
[root@kokojia ~]# setsid ping www.kokojia.com
[root@kokojia ~]# ps -ef |grep www.kokojia.com
root 31094 1 0 07:28 ? 00:00:00 ping www.kokojia.com
root 31102 29217 0 07:29 pts/4 00:00:00 grep www.kokojia.com
[root@kokojia ~]#
PS:这里需要大家注意的地方是,上例中我们的进程ID(PID)为31094,而它的父ID(PPID)为1(也就是为init进程ID),并不是当前终端的进程ID。
③& subshell
我们知道将一个或多个命名包含在“()”中就能让这些命令在子shell中运行中从而扩展出很多有趣的功能。当我们将"&"也放入“()”内之后就会发现所提交的作业并不在作业列表中,也就是说是无法通过jobs来查看的。
下面是subshell的示例用法:
[root@kokojia ~]# (ping www.kokojia.com &)
[root@kokojia ~]# ps -ef |grep www.kokojia.com
root 16270 1 0 16:13 pts/4 00:00:00 ping www.kokojia.com
root 16278 15362 0 16:13 pts/4 00:00:00 grep www.kokojia.com
[root@kokojia ~]#
从上例中我们可以看出新提交的进程的父ID(PPID)为1(init 进程的 PID),并不是当前终端的进程ID。因此并不属于当前终端的子进程,从而也就不会受到当前终端的HUP信号的影响了。
以上就是在Linux中让进程在后台运行的方法。
本次的Linux学堂之让进程在后台运行的方法的讲解到此就暂告一段落,如果以后有什么相关的内容继续进行补充或者修改的话,笔者会在此继续进行相关的内容的补充或者修改的工作,同时也欢迎大家对本次的讲解提出自己的建议和补充。最后笔者希望本次的讲解对大家学习Linux和Linux认证能够起到一定的帮助作用!