一、关于命令后台挂载的操作:
1.linux后台运行的命令语法
nohup command > /dev/null 2>&1 &
2.对nohup和&的解释
结尾的 & 可以让命令在后台运行,使得当前的终端(控制台)可以继续使用,但是将终端关闭或是退出用户后,这个在后台跑的相关进程就会停止。
nohup 表示不挂断地运行命令。输入这个命令,关闭终端后或者是退出当前的账号,进程仍然存在,但是单独在命令前添加nohup,还是会占用当前的终端,只能等命令运行完,才可以再用这个终端输入命令。
得到的标准输出或是标准错误会输出到当前目录的nohup.out文件里。
使用nohup和&挂载命令后,要使用 exit 退出当前用户,保证后台任务不会被打断或终止。
[F@localhost test]$ sh md.sh &
[1] 1905
[F@localhost test]$ jobs
[1]+ running sh md.sh &
在命令后加上&后,会得到一个进程号(PID),比如这里的1905就是sh md.sh这个命令的PID
命令 jobs 可以查看当前终端后台运行的进程, jobs -l可以查看进程号,jobs有三种状态:running、stopped、Terminated(任务被终止)
用ps查看这个终端后台的任务,会发现md.sh这个sh脚本里写的命令运行会再占用一个进程!
[F@localhost test]$ ps
PID TTY TIME CMD
1905 pts/1 00:00:00 sh
1910 pts/1 00:05:54 pmemd
6660 pts/1 00:00:00 ps
29252 pts/1 00:00:00 bash
2.命令中一些符号的解释
/dev/null 表示空设备文件,被叫做黑洞,所有写入它的内容都会永远丢失. 而尝试从它那儿读取内容则什么也读不到,对处理不需要的数据流很有用。
数字0表示stdin(标准输入,standard input)
数字1表示stdout(标准输出,standard output)
数字2表示stderr(标准错误,standard error)
1 > /dev/null 表示将标准输出的数据输出到空设备文件中,而这里1默认下可以省略,就有了上面命令的 > /dev/null
所以说,1 > /dev/null 和 > /dev/null 的效果是一样的 。
2>&1 表示将标准错误的内容输入到标准输出中,在这里,就是将标准错误也输入到 /dev/null 中
> 和 >> 用于数据流的重定向,这里的 > 表示覆盖, >> 表示追加
二、后台进程管理
1.简介
ps输出的后台任务状态是静态的,想查看动态的后台任务情况,使用命令top
2.一些常用的命令和选项搭配
停止一个进程:
#停止一个后台进程:
kill -stop <PID>
#停止一个前台进程:
Ctrl+Z
将停止的进程恢复运行:
#查看当前bash后台的运行的进程:
[F@localhost test]$ jobs -l
[1]+ 32151 Stopped sh run.sh
#将当前bash停止的后台进程任务再次运行,同样是在后台运行:
[F@localhost test]$ bg %1
#放到前台运行:
[F@localhost test]$ fg %1
[1]+ 32151 Running sh run.sh
将运行的进程杀死:
[F@localhost test]$ kill -9 32151
[1]+ Killed sh run.sh
查看所有终端后台的进程任务:
ps -ef > all_work.txt
查看指定命令的进程:
#查找命令中有sh run.sh关键字的进程,同时显示表头:
ps -ef|egrep "(UID|sh run.sh)"
#查看指定的pid、ppid和cmd信息:
ps -efo pid,ppid,cmd |egrep "(UID|sh run.sh)"
关于ps的-e、-f和-o选项:
-e(exact) 可以查看到当前终端外的后台任务
-f可以让命令信息显示完整,方便查找
-o 后接指定输出的信息列名,用 , 隔开
我用kill将一个进程杀死后,用ps查看还是能看到这个进程(可能光杀死子进程不行,还要杀死父进程),如何判断这个进程是否被真的杀死:
#用kill 0 <PID> 进行判断:
#$?查看返回值,为0表示进程存在,为1表示进程不存在
[F@localhost test]$ kill -0 7583
bash: kill: (7583) - No such process
[F@localhost test]$ echo $?
1
[F@localhost test]$
#用ps进行查看:
[F@localhost test]$ ps -ef |grep "7583"