前言我们在使用linux的时候,经常会把一个程序放在后台运行。这时候我们需要在程序末尾使用[&]符号,但是当直接关闭终端时,程序就会退出。下面我介绍5种方法,程序在关闭终端后继续运行。在思考的时候,首先要考虑一个问题。为什么直接关闭终端,后台程序就退出了?那是因为终端会向当前环境启动的后台任务发送一个SIGHUP信号,让正在运行的程序暂停,所以直接忽略SIGHUP即可。nohup最常用的命令是[nohup]。从名字可以看出是暂停正在运行的命令,关闭终端还是退出一个账户,进程会继续运行。它还需要与[&]符号一起使用。Usage:nohupCommand[Arg...][ &]$nohupshtest.sh直接关闭当前终端,再??打开一个查看$ps-few|greptest.sh从上面我们可以看出我们运行的test.sh父进程变成了[PID1]。它由linux主进程接管。setsidnohup忽略SIGHUP信号。还有其他想法吗?setip命令可以重新打开会话,继承父进程组的ID,脱离父进程的控制。由下图可以看出,test.sh脚本的父进程已经是init1了,此时无论是关闭还是退出终端,都与后台程序无关。$setsidshtest.shsetsid和nohup的另一个区别是不需要使用&背景符号。exit使用exit命令退出终端,我们的程序会继续运行。为什么?这是因为在使用exit命令退出终端时,不会向终端所属的任务发送SIGHUP信号。由huponexit配置项控制,默认关闭。可以使用shopt命令查看。[root@api~]#shopt|grephuponexithuponexitoff配置huponexit为on,再次使用exit命令退出,其所属的任务会跟随退出。[root@api~]#shopt-shuponexit[root@api~]#shopt|grephuponexithuponexitontraptrapcommandLinux内置命令,接收到指定信号时要采取的动作,后接要处理的信号名,常用信号如下:当A脚本需要在后台,我们也不希望终端退出关闭程序。我们可以在脚本中添加一个trap命令来忽略SIGHUP信号(挂起进程)。#!/bin/shtrap""HUPwhiletrue;dodate>>/root/test.txtsleep1doneLinuxscreen命令用于多窗口管理程序,它可以创建一个终端,让程序运行screenshtest.sh&从例子中可以看出、测试脚本屏幕终端的父进程为屏幕终端进程,屏幕终端的父进程PID1同时完成后台进程的操作。综上所述,我们已经完成了后台运行linux程序的5种方法。另外,我们不需要关心终端是否关闭。你还知道其他在linux后台运行程序的方法吗?
