linux 使进程后台运行:&/nohup/disown
在linux机器上工作,大多都是本地电脑通过xshell之类的工具连接到远端的linux主机上。当我们在终端或者控制台工作时,不希望由于运行比较耗时的作业而占用了当前屏幕;也可能我们的电脑和远端的linux主机之间的网络不稳定,我们连接的终端随时可能断开,终端断开时,我们执行的命令也会终止,这是我们不希望的;也可能我们启动的作业非常耗时了,快要下班了,等不及这个作业完成了,必须回家
在linux机器上工作,大多都是本地电脑通过xshell之类的工具连接到远端的linux主机上。当我们在终端或者控制台工作时,不希望由于运行比较耗时的作业而占用了当前屏幕;
也可能我们的电脑和远端的linux主机之间的网络不稳定,我们连接的终端随时可能断开,终端断开时,我们执行的命令也会终止,这是我们不希望的;
也可能我们启动的作业非常耗时了,快要下班了,等不及这个作业完成了,必须回家做饭吃,嗯,这个很重要,此时要是直接关闭终端,那么这个作业就会终止,以前的计算就白费了,这也是我们不希望的。
如何解决这些问题呢,下面一个一个来看。
解决方法:
我们知道,当用户注销(logout)或者网络断开时,终端会收到 HUP(hangup)信号从而关闭其所有子进程。因此,我们的解决办法就有两种途径:要么让进程忽略 HUP 信号,要么让进程运行在新的会话里从而成为不属于此终端的子进程。
hangup 名称的来由
在 Unix 的早期版本中,每个终端都会通过 modem 和系统通讯。当用户 logout 时,modem 就会挂断(hang up)电话。 同理,当 modem 断开连接时,就会给终端发送 hangup 信号来通知其关闭所有子进程。
& – 让命令后台运行
当我们在终端或者控制台工作时,如何让耗时的作业而不再占用了当前屏幕?
当在前台运行某个作业时,终端被该作业占据,此时可以在命令后面加上&实现后台运行。例如:
command > output.txt 2>&1 &
注意: 这个命令若需要和用户交互,就不能放在后台执行,因为这样你的命令就会卡在交互的地方;
命令运行可能输出结果到屏幕上,这样就干扰你工作,所以上面命令使用了“> output.txt 2>&1”,把结果重定向输出到指定文件中。
特别注意,使用这种方式时,若由于网络原因或者我们主动断开终端时,这个命令也会终止;
所以确信终端短时间内不会断开时,这种方式还是挺好用的。
nohup – 让提交的命令忽略hangup信号
使用&命令后,作业被提交到后台运行,当前终端/控制台没有被占用,但是一旦把当前终端关掉(退出账户时),提交的作业就会停止运行。nohup命令可以在你退出账户之后继续运行相应的进程。nohup就是不挂起(no hang up)的意思。
命令的一般形式为:
nohup command > output.txt 2>&1 &
注:使用了nohup之后,很多人就不管了,其实这样有可能在当前账户非正常退出或者结束的时候,命令还是
会自己结束的。所以在使用nohup后台运行命令之后,需要使用exit正常退出当前账户,这样才能保证命令一直在后台运行。
disown – 脱离终端的子进程
我们已经知道,如果事先在命令前加上 nohup就可以避免 HUP信号的影响。但是如果我们未加任何处理就已经提交了命令,该如何补救才能让它避免 HUP 信号的影响呢?
这时想加nohup已经为时已晚,只能通过作业调度和disown来解决这个问题。
- 使用 ctrl + z 把这个命令挂起(Suspend)
- 使用 jobs 命令查看后端命令,只是你会发现这个命令是 stopped 状态
- 使用 bg %N (注意,这个N是对应的编号),让这个命令后端执行
- 再次使用 jobs 命令查看,发现那个命令的状态就变为 running 了,就是已经是后台执行了
- 使用 disown -h %N,使这个进程运行在新的会话里,从而成为不属于此终端的子进程
- exit正常退出这个终端
更多推荐
所有评论(0)