Linux后台任务的运行、查看和关闭

1 基本使用

&

加一个&在命令的最后,可以把这个命令放到后台执行,如:

$ sleep 100 &
[1] 4650

ctrl + z

可以将一个正在前台执行的命令放到后台,并且处于暂停状态。

jobs

查看当前有多少在后台运行的命令,如:

$ jobs
[1]  +  6418 running                 sleep 100 &

fg

将后台中的命令调至前台继续运行。如果后台中有多个命令,可以用fg %jobnumber将选中的命令调出,如:

$ fg %1
[1]  +  6418 running                 sleep 100 

bg

将一个在后台暂停的命令,变成在后台继续执行。如果后台中有多个命令,可以用bg %jobnumber将选中的命令调出。


2 查找进程PID

ps

ps命令是Process Status的缩写,可以用来列出系统中当前运行的那些进程。再配合grep就可以通过关键字来查找进程,如:

$ ps aux | grep sleep
ubuntu    6418  0.0  0.0   6012   652 pts/0    SN   21:42   0:00 sleep 100

或者

$ ps -ef | grep sleep
ubuntu    6418  0.0  0.0   6012   652 pts/0    SN   21:42   0:00 sleep 100

pgrep

pgrep通过程序的名字来查询进程PID的工具,一般是用来判断程序是否正在运行,如:

$ pgrep sleep
6418


3 杀死进程

kill

  • kill %jobnumber 或者
  • kill pid

pkill

pkill命令可以按照进程名杀死进程。

$ pkill sleep
[1]  + 6418 terminated  sleep 100

killall

killall命令使用进程的名称来杀死进程,使用此指令可以杀死一组同名进程。


4 让进程可靠的在后台运行

用ssh登录了远程的Linux服务器,运行了一些耗时较长的任务, 结果却由于网络的不稳定导致任务中途失败。如何让命令提交后不受本地关闭终端窗口/网络断开连接的干扰呢?

nohup

当用户注销或者网络断开时,终端会收到HUP(hangup)信号从而关闭其所有子进程。在命令前加上nohup可以让进程忽略HUP信号,如:

$ nohup ping www.ibm.com &
[1] 3059
nohup: appending output to `nohup.out'

setsid

如果我们换个角度思考,如果我们的进程不属于接受 HUP 信号的终端的子进程,那么自然也就不会受到 HUP 信号的影响了。setsid就能帮助我们做到这一点,如:

$ setsid ping www.ibm.com

(&)

使用subshell的小技巧,将一个或多个命名包含在“()”中就能让这些命令在子shell中运行中,当我们将"&"也放入“()”内之后,也可以躲过HUP信号,如:

$ (ping www.ibm.com &)

disown

如果我们已经提交了某个任务,但忘记添加nohup等,这时便需要使用disown命令。

  • disown -h %jobnumber或者disown -h pid可使某个作业忽略HUP信号。
  • disown -ah 可使所有的作业都忽略HUP信号。
  • disown -rh 可使正在运行的作业忽略HUP信号。

在手机上阅读或分享本文请扫描以下二维码:
By @Zhengyi Yang in
Tags : #linux,

Comments

评论功能已关闭。