Linux下在后台运行命令

使用ssh会话在远程linux服务器执行命令时,如果由于网络问题终端断开连接,则正在前台运行命令也会随之终止,为了解决这个问题,就需要将命令放在后台运行,并且退出当前终端也不会终止进程。

# &命令

command &

在要执行的命令后加&表示将此进程放在后台运行,程序中的输出依然会在前台显示。

如果希望继续在当前终端工作的话,可以用以下命令将输出重定向到文件中:

command > out.file 2>&1 &

上述命令执行后,会显示出进程号。也可用ps -ef | grep查询进程号(ps -ef | grep python查询python进程),kill PID杀死进程号为PID的进程。

当ssh会话没有断开或用户未退出时,使用&执行的命令会在后台安静的运行,但当用户退出或由于意外断开连接时,命令依然会终止

# nohup命令

nohup在*中的定义:

nohup 是一个 POSIX 命令,用于忽略 SIGHUP ("signal hang up" 译:挂断信号) 。 SIGHUP信号是终端注销时所发送至程序的一个信号。nohup命令,在默认情况下(非重定向时),会输出一个名叫 nohup.out 的文件到终端上。

也就是说,nohup可以防止终端注销时导致的进程终止。

通常将nohup&命令放在一起使用:nohup command &,此时命令将在后台运行,且断开ssh会话或退出当前用户都不会终止进程。

nohup命令默认将程序所有的输出保存到当前目录的nohup.out文件中,也可以指定输出文件:

nohup command > out.file 2>&1 &

其中> out.file将输出指定到out.file文件,2>&1将标准错误信息重定向到标准输出(0,1,2分别代表stdin标准输入,stdout标准输出,stderr标准错误),最后的&即为转到后台运行。

注意:程序转入后台运行之后,最好使用exit来退出当前用户,否则可能由于非正常退出导致进程意外终止。

# jobs命令

jobs用来查看当前终端有哪些后台进程

jobs -l可以显示后台任务的进程号

jobs命令的输出结果中,+表示是当前的作业,-表示是当前作业的下一个作业。

任务的状态分为3种:RunningStopped(程序暂停),Terminated(进程终止)。

不过jobs只对当前终端有效,在新的终端中将无法查询,此时就需要使用上文中的ps命令来查询后台进程。

# 前台进程挂起和终止

ctrl + z将正在前台运行的程序转至后台,并挂起(Stopped)

ctrl + c终止前台程序

# 后台进程挂起和终止

red hat中,通过kill -stop PID将后台进程挂起(Stopped),其中PID为ps查询的进程号。

通过jobs查看任务号numkill %num终止进程,或者通过ps查看进程号PIDkill PID终止进程。

# fg、bg命令

fg命令将后台程序转至前台运行,若有多个后台进程,则用fg %num将后台进程num转至前台。

bg将挂起的任务进程重新启动,若有多个后台进程,则用bg %num将后台任务num重新启动。

注意:上述num是通过jobs命令查询到的后台进程号,而非ps查询的进程号PID

上一篇:2.nohup和&后台运行,进程查看及终止


下一篇:python脚本如何知道自己以nohup模式运行?