一、预备知识
1 快应用
命令 | 含义 |
---|---|
& | 这个用在一个命令的最后,可以把这个命令放到后台执行 |
jobs | 查看当前有多少在后台运行的命令 |
jobs -l | 显示PID,比jobs更好用 |
fg | 将后台中的命令调至前台继续运行,如果后台中有多个命令,可以用 fg %jobnumber 将选中的命令调出,%jobnumber 是通过jobs 命令查到的后台正在执行的命令的序号(不是pid) |
bg | 将一个在后台暂停的命令,变成继续执行,如果后台中有多个命令,可以用bg %jobnumber 将选中的命令调出,%jobnumber 是通过jobs 命令查到的后台正在执行的命令的序号(不是pid) |
ps | 列出系统中正在运行的进程,会显示PID |
kill pid | 发送信号给一个或多个进程(经常用来杀死一个进程) |
kill -stop pid | 暂停PID为pid的任务 |
history | 查看当前用户的历史命令 |
2 理解
- 前台任务:”前台任务”(foreground job)是独占命令行窗口的任务,只有运行完了或者手动中止该任务,才能执行其他命令。
- 后台任务:与前台任务相对应,在多任务系统中,有一些任务在运行的时候,并不需要与用户交互。它们通常在不打扰用户其它工作的时候默默地执行(此时可以输入其他的命令)。
- 后台任务的特点:继承当前session(对话)的标准输出(stdout)和标准错误(stderr)。因此,后台任务的所有输出依然会同步地在命令行下显示。不再继承当前session的标准输入(stdin)。你无法向这个任务输入指令了。如果它试图读取标准输入,就会暂停执行(halt)。
- ”后台任务”与”前台任务”的本质区别只有一个:是否继承标准输入。所以,执行后台任务的同时,用户还可以输入其他命令。
- 当前任务:默认当前任务为
[1]
的任务,如果后台的任务号有2个,[1],[2]
;如果当第一个后台任务顺利执行完毕,第二个后台任务还在执行中时,当前任务便会自动变成后台任务号码“[2]”的后台任务。所以可以得出一点,即当前任务是会变动的。当用户输入“fg”、“bg”和“stop”等命令时,如果不加任何引号,则所变动的均是当前任务。+
表示是当前任务,-
表示的是当前作业之后的一个作业。 - 守护进程(daemon)是指在UNIX或其他多任务操作系统中在后台执行的电脑程序,并不会接受电脑用户的直接操控。此类程序会被以进程的形式初始化。守护进程程序的名称通常以字母“d”结尾:例如,syslogd就是指管理系统日志的守护进程。用户退出session之后,后台任务是否会继续执行是判定是否为“守护进程”的依据
session退出之后,linux系统设计如下:
- session就是我们平常所说的终端窗口
- 用户准备退出 session
- 系统向该 session 发出SIGHUP信号
- session 将SIGHUP信号发给所有子进程
- 子进程收到SIGHUP信号后,自动退出
前台任务会随着session的退出而退出是因为它收到了SIGHUP信号。后台任务是否会收到SIGNUP信号,取决于shell的 huponexit 参数。可以通过shopt | grep huponexit
查看该参数的值。大多数Linux系统,这个参数默认关闭(off
)。因此,session退出的时候,不会把SIGHUP信号发给”后台任务”,即此时的后台任务是守护进程。
二、命令操纵
1 提交
nohup 命令
用途:不挂断地运行命令。
语法:nohup Command [ Arg … ] [ & ]
例子:
nohup yourcommand &
- yourcommand:你的命令,比如
./a.sh
- 将“你的命令”的输出默认保存到
nohup.out
中,若nohup.out
存在,就追加 &
指的是在后台运行
nohup command > myout.file 2>&1 &
- 将输出保存到
myout.file
中 - 0 – stdin (standard input),1 – stdout (standard output),2 – stderr (standard error) ;0是标准输入,1是标准输出,2是标准错误
2>&1
含义是将标准错误(2)重定向到标准输出(&1)> myout.file
标准输出再重定向到指定文件
nohup ./command.sh >/dev/null 2>&1 &
/dev/null
文件是一个无底洞,何东西都可以定向到这里,但是却无法打开。 所以一般很大的stdout和stderr当你不关心的时候可以利用stdout和stderr定向到这里。
2 查看
jobs # 显示提交的指令
jobs -l # 比 job 多显示 PID
ps -ef # e显示所有进程(等价于-A), f 全部列出,通常和其他选项联用
ps -ef | grep xxx # 用grep来控制显示的命令
history # 查看历史命令
top # 实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器
下面是top的详细介绍
比较重要的有
3 结束/暂停/继续
kill pid # 杀死一个进程
kill -9 pid # 必杀一个进程
kill -l # 查看Linux/Unix的信号变量, 上面的9就是一个信号编号,它指代一种信号变量
pkill -u usr # 杀死用户 usr 的所有进程
kill -stop pid # 暂停 pid 的进程
bg n # 开始 n(通过 jobs 查看) 的进程
# 其他杀死一个用户的所有进程
ps -ef | grep usr | awk '{ print $2 }' | sudo xargs kill -9
killall -u ttlsa
参考
https://blog.csdn.net/hust_sheng/article/details/50766752
https://www.cnblogs.com/keystone/p/11159665.html