Linux下在后台运行命令
使用ssh会话在远程linux服务器执行命令时,如果由于网络问题终端断开连接,则正在前台运行命令也会随之终止,为了解决这个问题,就需要将命令放在后台运行,并且退出当前终端也不会终止进程。
# &命令
command &
在要执行的命令后加&表示将此进程放在后台运行,程序中的输出依然会在前台显示。
如果希望继续在当前终端工作的话,可以用以下命令将输出重定向到文件中:
command > out.file 2>&1 &
命令中参数的含义见下文nohup命令
上述命令执行后,会显示出进程号。也可自己查询进程号:
ps -ef | grep
其中查询python进程:
ps -ef | grep python
杀死进程号为PID的进程:
kill 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来退出当前用户,否则可能由于非正常退出导致进程意外终止。
# 查看日志文件
nohup会将输出或错误信息打印到nohup.out文件中,我们需要在程序运行结束之后查看该文件,用来查看程序运行过程或检查程序是否正常运行。
Linux中通常用tail命令来查看日志文件,tail命令参数如下:
-f 循环读取
-q 不显示处理信息
-v 显示详细的处理信息
-c<数目> 显示的字节数
-n<行数> 显示行数
--pid=PID 与-f合用,表示在进程ID,PID死掉之后结束.
-q, --quiet, --silent 从不输出给出文件名的首部
-s, --sleep-interval=S 与-f合用,表示在每次反复的间隔休眠S秒
此处我们也将nohup.out看作日志文件,以下命令表示查看nohup.out文件的最后5行:
tail -n 5 nohup.out
# 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

浙公网安备 33010602011771号