linux前台,后台运行命令的区别
Linux前台和后台进程说明Linux前台和后台进程说明
一.有关进程的几种常用方法
1.1&符号
在命令后面加上一个&符号,表示该命令放在后台执行,如:
[oracle@singledb~]$crontab-l
2017***/u02/rman_incremental_backup.sh&
1.2Jobs命令
该命令可以查看当前有多少在后台运行的命令,jobs列出当前shell环境中已启动的任务状态,若未指定jobsid,则显示所有活动的任务状态信息。
jobs命令执行的结果,+表示是一个当前的作业,减号表是是一个当前作业之后的一个作业,jobs-l选项可显示所有任务的PID,jobs的状态可以是running,stopped,Terminated,但是如果任务被终止了(kill),shell从当前的shell环境已知的列表中删除任务的进程标识;也就是说,jobs命令显示的是当前shell环境中所起的后台正在运行或者被挂起的任务信息。如:
[oracle@singledb~]$jobs
[1]+Running/u02/rman_incremental_backup.sh&
在这里讲一个概念:当前任务
如果后台的任务号有2个,[1],[2];如果当第一个后台任务顺利执行完毕,
第二个后台任务还在执行中时,当前任务便会自动变成后台任务号码[2]的后台任务。
所以可以得出一点,即当前任务是会变动的。当用户输入fg、bg和stop等命令时,如果不加任何引号,则所变动的均是当前任务。
1.3fg命令(foreground)
该命令将后台运行的进程调到前台来运行。具体用法:fg%n。
这里的N是jobs看到的jobnumber。如:
[oracle@singledb~]$fg%1
-bash:fg:jobhasterminated
[1]+Exit1/u02/rman_incremental_backup.sh>/u02/rman.log2>&1
1.4ctrl+z组合键
该命令将一个正在前台执行的命令放到后台,并且暂停。
1.5bg命令(background)
该命令将一个在后台暂停运行的命令,变成继续在后台执行的命令。
用法:bg%n。N是jobs命令查看到的jobnumber。如:
[oracle@singledb~]$/u02/rman_incremental_backup.sh
[1]+Stopped/u02/rman_incremental_backup.sh
--我们运行备份命令,然后按下CTRL+Z
[oracle@singledb~]$jobs
[1]+Stopped/u02/rman_incremental_backup.sh
--用jobs查看进程状态
[oracle@singledb~]$fg%1
/u02/rman_incremental_backup.sh
--用fg将进程调到前台运行
[1]+Stopped/u02/rman_incremental_backup.sh
--按下ctrl+z
[oracle@singledb~]$bg%1
[1]+/u02/rman_incremental_backup.sh&
--用bg将后台暂停的进程继续执行,这里自动加了一个&符号
[oracle@singledb~]$jobs
[1]+Running/u02/rman_incremental_backup.sh&
--查看job状态
1.6结束正在运行的进程
1.6.1结束前台进程
这种只需要按下组合键:ctrl+c即可。
1.6.2结束后台运行的进程
这种情况下也有两种方法:
(1)用jobs查看进程的jobnumber,然后用命令:kill%n来结束。
(2)用ps查看进程的pid,然后用命令:killpid来结束。
这里对kill做点说明,kill除了可以终止进程,还能给进程发送其它信号,使用kill-l可以察看kill支持的信号。
[oracle@singledb~]$kill-l
1)SIGHUP2)SIGINT3)SIGQUIT4)SIGILL
5)SIGTRAP6)SIGABRT7)SIGBUSSIGFPE
9)SIGKILL10)SIGUSR111)SIGSEGV12)SIGUSR2
13)SIGPIPE14)SIGALRM15)SIGTERM16)SIGSTKFLT
17)SIGCHLD18)SIGCONT19)SIGSTOP20)SIGTSTP
21)SIGTTIN22)SIGTTOU23)SIGURG24)SIGXCPU
25)SIGXFSZ26)SIGVTALRM27)SIGPROF28)SIGWINCH
29)SIGIO30)SIGPWR31)SIGSYS34)SIGRTMIN
35)SIGRTMIN+136)SIGRTMIN+237)SIGRTMIN+338)SIGRTMIN+4
39)SIGRTMIN+540)SIGRTMIN+641)SIGRTMIN+742)SIGRTMIN+8
43)SIGRTMIN+944)SIGRTMIN+1045)SIGRTMIN+1146)SIGRTMIN+12
47)SIGRTMIN+1348)SIGRTMIN+1449)SIGRTMIN+1550)SIGRTMAX-14
51)SIGRTMAX-1352)SIGRTMAX-1253)SIGRTMAX-1154)SIGRTMAX-10
55)SIGRTMAX-956)SIGRTMAX-857)SIGRTMAX-758)SIGRTMAX-6
59)SIGRTMAX-560)SIGRTMAX-461)SIGRTMAX-362)SIGRTMAX-2
63)SIGRTMAX-164)SIGRTMAX
SIGTERM是不带参数时kill发送的信号,意思是要进程终止运行,但执行与否还得看进程是否支持。
如果进程还没有终止,可以使用kill-SIGKILLpid,这是由内核来终止进程,进程不能监听这个信号。
1.7ps命令
该命令用户列出系统中正在运行的进程。常用的参数:ps-ef
关于这2个参数含义,参考ps命令的帮助:
[oracle@singledb~]$ps--help
*********simpleselection******************selectionbylist*********
-Aallprocesses-Cbycommandname
-Nnegateselection-GbyrealgroupID(supportsnames)
-aallw/ttyexceptsessionleaders-UbyrealuserID(supportsnames)
-dallexceptsessionleaders-gbysessionORbyeffectivegroupname
-eallprocesses-pbyprocessID
Tallprocessesonthisterminal-sprocessesinthesessionsgiven
aallw/tty,includingotherusers-tbytty
gOBSOLETE--DONOTUSE-ubyeffectiveuserID(supportsnames)
ronlyrunningprocessesUprocessesforspecifiedusers
xprocessesw/ocontrollingttystbytty
***********outputformat*********************longoptions***********
-o,ouser-defined-ffull--Group--User--pid--cols--ppid
-j,jjobcontrolssignal--group--user--sid--rows--info
-O,Opreloaded-ovvirtualmemory--cumulative--format--deselect
-l,llonguuser-oriented--sort--tty--forest--version
-FextrafullXregisters--heading--no-heading--context
*********miscoptions*********
-V,VshowversionLlistformatcodesfASCIIartforest
-m,m,-L,-T,HthreadsSchildreninsum-ychange-lformat
-M,Zsecuritydatactruecommandname-cschedulingclass
-w,wwideoutputnnumericWCHAN,UID-Hprocesshierarchy
二.前台进程和后台进程的一点讨论
整理这篇文章的目的就是弄清楚在实际使用中这两种进程的区别。一般情况下,我们都是通过shell连接到linux服务器上,
那么,假如我们在这个shell窗口执行一个备份或者其他命令,即前台命令。
在这个时候,前台命令没有执行完,我们把这个终端关闭了,那么这个命令也就会中断。
即使我们在执行命令时加了&符号,让进程在后台执行,终端的关闭也会造成命令的结束。
解决这个问题有两种方法:
(1)将命令添加到crontab里,让系统自己调用。
这种方法将使命令在服务器端执行,这样即使终端关闭,也不影响命令的执行。
(2)使用nohup命令(nohangup)。
该命令用于保证不挂断地运行命令。如:
[oracle@singledb~]$nohup/u02/rman_incremental_backup.sh&
[1]4409
[oracle@singledb~]$jobs
[1]+Runningnohup/u02/rman_incremental_backup.sh&
这里要注意:
运行nohup命令后,按任意键返回shell窗口,然后输入exit退出终端,不能直接关闭窗口,直接关闭窗口的话,还是会造成命令进程和终端一起结束。
在Unix中永久的后台进程称为守护进程(daemon)。守护进程通常从系统启动时自动开始执行,系统关闭时才停止。
而nohup启动的进程虽然也是不中断的执行,但是当进程执行完毕后就会退出。