进程管理类命令
信号:
在linux当中所有的进行管理都是靠信号来管理的.像我们平时要结束某个进程就是使用的15信号SIGTERM,还有想要强制杀死某个进程,就是使用的9信号SIGKILL等等.
在linux可以查看信号有哪些的指定太多了,kill -l ; trap -l; man 7 signal等等
这里列数linux中的所有信号:
信号名程有点长,信号有三种表示法:
数字方式 9 2 3 1 19 15 18
SIGNAL完整写法 SIGKILL SIGTERM SIGQUIT SIGHUP SIGINT SIGSTOP
简写法: HUP INT QUIT CONT QUIT KILL TERM
信号虽然多,但是常用的没几个,常用的信号:
-0 进行命令的健康性检查,这种检查不严谨,意思意思
-1 SIGHUP 无须关闭进程而让其重读配置文件
-2 SIGINT 终止正在运行的进程,相当于ctrl + c,使用ctrl+c快捷键只能终止前台进程,但-2信号前台后台都能终止
-3 SIGQUIT 相当于ctrl + \
-9 SIGKILL 强制杀死正在运行的进程
-15 SIGTERM 发送正常结束进程,15信号是结束不了停止态的进程,默认信号.TERM是terminal终端简写
-18 SIGCONT 复活进程 SIGCONT,但是不能复活那种交互的后台停止命令
-19 SIGSTOP 进入停止态 SIGSTOP
这里在重复说下,上面表里命名没有0信号,这里怎么还有0信号呢,这只是一个特殊的用法,可以不记,看下官方给0信号的解释:
If sig is 0, then no signal is sent, but error checking is still performed
如果这个信号是0,则不会真正的发送信号,到那时会进行错误检查
与信号相关的命令:
kill命令 用于向进程发送信号,以实现进程的管理
选项:
-l 显示信号列表
kill -l # 把#对应的数字翻译成信号
-s SIGNAL 指定发送的信号,一般可以直接简写成-SIGNAL
语法:
kill SIGNAL PID1 PID2 ... 给PID进程发送SIGNAL信号
kill SIGNAL %JOBID 给作业编号%JOBID的进程发送SIGNAL信号
killall命令 根据进程名来管理进程
主要用来批量结束相同命令名的进程
语法:
killall [-SIGNAL] COMMAND 使用命令名称来结束命令,而且是一次性结束所有
killall -0 ping 检查ping命令是否是健康的,不严谨的检查
pkill命令 根据进程名或其他属性来结束进程
选项:
-t 终端 根据终端来查找相关进程并结束
-e 显示哪个进程被结束了,及其PID
-u EUID 结束有效UID
-U UID 结束实际UID
trap命令 捕获信号设定自定义操作
语法:
trap [OPTIONS] ‘CMD‘ SIGNAL 在收到系统发出的指定信号后执行自定义指令
trap ‘‘ SIGNAL 接收到信号,什么触发指令也不执行
trap ‘-‘ SIGNAL 恢复信号的原始作用
选项:
-p 列出自定义信号操作
-l 打印信号列表,等同于kill -l
作业管理:
在linux中拷贝文件真的太不舒服了,小文件还好,如果大文件了.那就得干等着了,什么也做不了.只能等cp命令结束后在操作.后来才知道可以把cp命令放入到后台继续执行.
把程序放到后台执行的方法:
- COMMAND & 可以让COMMAND在后台继续执行
- 先打开COMMAND命令,然后按ctrl + z让程序在后台暂停
让后台程序继续执行的方法:
- kill -18 COMMAND
- bg %工作号 工作号可以通过jobs命令查询到
把后台程序挪回前台的方法:
- fg %工作号 工作号可以通过jobs命令查询到
备注:无论是前台进程还是后台进程,都是当前shell的子进程,也就是会所在当前shell结束后子进程中前台进程还是后台进程都会结束.有没有不结束的方法吗?
三种在bash结束的时候不终止子进程的方法:
- 先运行screen命令,然后在执行要操作的命令
- 先运行tmux命令,然后在执行要做错的命令
- nohup COMMAND COMMAND就是要执行的命令
不是所有放入后台的进程都能继续执行,像那些占据终端前台窗口与用户有交互的命令是不能放在后台继续运行的,如vim nano等等
后台进程不占据终端窗口,还可以在后台继续执行.这就可以实现程序的并行执行了.
方法1:
cat all.sh
COMMAND1 &
COMMAND2 &
COMMAND3 &
方法2:
(COMMAND1&);(COMMAND2&);(COMMAND3&)
方法3:
{ COMMAND1; COMMAND2; }& f2.sh& f3.sh&
看个小示例:
1 #/bin/bahs 2 3 # 4 5 NET=10.0.0. 6 7 8 9 for i in {1..254};do 10 11 { 12 13 ping -c1 -w1 ${NET}${i} &> /dev/null && echo "${NET}${i} is up" || echo "${NET}${i} is down" 14 15 }& 16 17 done 18 19 wait
小命令:
screen命令
主要作用是在shell窗口关闭时screen中的子进程不会关闭
选项:
-S 创建会话
-x 加入某个会话
-ls 列出已隐藏的会话
-r [SESSION] 恢复某个会话
Ctrl+a,d 隐藏会话,先按ctrl+a键,松开再按d键
案例一:
客户端一:创建新screen会话
screen -S new
客户端二:加入new会话
screen -x new
然后在客户端一中键入的命令在客户端二上也能同步看到,同样的客户端二同样也可以操作.客户端已上也能看到客户端二操作.这就是QQ远程协助.嘿嘿
客户端二:退出new会话
ctrl +a 松开再按d键
案例二:
创建会话
screen
执行某个耗时的命令例如
tar -cJf /tmp/usr.tar.xz /usr
隐藏会话
ctrl+a 松开再按d键
可以断开终端去玩游戏吧
exit
玩完回来看看耗时命令跑完了吗
screen -ls
screen -r [SESSION] [SESSION] 就是通过screen -ls查到的号码
tmux命令
tmux是screen的增强版,更加强大.不过也有一点不好,就是功能太强大.记不住
tmux窗口有大量的快捷键,所有的快捷键调用前都有一个前缀ctrl+b,只有先按下ctrl+b后快捷键才能生效.
创建会话:
第一种: tmux 直接创建一个编号为0的会话
第二种: tmux new -s NAME 创建一个名为NAME的会话
隐藏会话:
按住ctrl + b 松开再按d键
关闭会话:
第一种: 在会话中,按住ctrl+b 松开再按x键 确认即可
第二种: 在bash中使用 tmux kill-session -t NAME
加入会话:
tmux attach -t NAME
切换会话:
tmux switch -t NAME
显示会话列表
tmux ls
在tmux中有会话,窗口,窗格的概念.上边都是创建会话的类似screen的功能,下面的都是tmux独有的功能
创建新窗口:
第一种:在bash中
tmux new-window 创建一个新窗口默认名称是数字 0 1 3等等
备注在创建窗口的时候前提必须先创建一个会话.把新窗口加入到这个会话中
tmux new-window -n WIN-NAME 给新窗口起个名称
第二种:在会话中
按住ctrl +b,松开再按c 可以创建一个新窗口
按住ctrl +b,松开再按, 可以给当前窗口重命名
切换窗口:
第一种:在bash中
tmux select-window -t WIN-NUMBER 切换到指定窗口号的窗口
tmux select-window -t WIN-NAME 切换到指定窗口名称的窗口
第二种:在会话中
按住ctrl+b,松开再按p 切换到上一个窗口
按住ctrl+b,松开再按n 切换到下一个窗口
按住ctrl+b,松开再WIN-NUMBER 切换到指定窗口数字的窗口
按住ctrl+b,松开再按w 从列表中选在要切换的窗口
隐藏会话:
按住ctrl+b,松开再按d
关闭会话:
按住ctrl+b,松开再按x 确认
创建窗格:
按住ctrl+b,松开再按” 切换成上下窗格
按住ctrl+b,松开再按% 切换成左右窗格
切换光标:
按住ctrl+b,松开再按方向键 把光标移动到上下左右窗格上
按住ctrl+b,松开再按; 把光标移动到上窗格
按住ctrl+b,松开再按o 把光标移动到下窗格
按住ctrl+b,松开再按{ 把光标移动到左窗格
按住ctrl+b,松开再按} 把光标移动到右窗格
切换窗格位置:
按住ctrl+b,松开再按ctrl+o 当前光标所在窗格上移
按住ctrl+b,松开再按alt+o 当前光标所在窗格下移
其他用法:
按住ctrl+b,松开再按! 把当前窗格切换成一个单独的窗口
按住ctrl+b,松开再按? 显示帮助,q退出
按住ctrl+b,松开再按q 显示窗口序号
个人感觉tmux功能是强大,不过好似用不到这么多功能,或者说这强大功能是针对少数有需求的人.基础几个就好.笔记现在远程管理工具都支持标签了,鼠标点起来也挺方便的.tmux和screen的主要功能是在关闭shell后不断子进程.萝卜青菜各有所爱.