使用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种:Running
,Stopped
(程序暂停),Terminated
(进程终止)。
不过jobs
只对当前终端有效,在新的终端中将无法查询,此时就需要使用上文中的ps
命令来查询后台进程。
# 前台进程挂起和终止
ctrl + z
将正在前台运行的程序转至后台,并挂起(Stopped)
ctrl + c
终止前台程序
# 后台进程挂起和终止
red hat
中,通过kill -stop PID
将后台进程挂起(Stopped),其中PID为ps
查询的进程号。
通过jobs
查看任务号num
,kill %num
终止进程,或者通过ps
查看进程号PID
,kill PID
终止进程。
# fg、bg命令
fg
命令将后台程序转至前台运行,若有多个后台进程,则用fg %num
将后台进程num
转至前台。
bg
将挂起的任务进程重新启动,若有多个后台进程,则用bg %num
将后台任务num
重新启动。
注意:上述num
是通过jobs
命令查询到的后台进程号,而非ps
查询的进程号PID