linux前台,后台运行命令的区别

wutongyuq 2012-11-07

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启动的进程虽然也是不中断的执行,但是当进程执行完毕后就会退出。

相关推荐

kongguguren / 0评论 2011-11-16