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信号。
Comments