给朋友写的 Shell 入门心得
Shell 命令应该从资源管理的角度去学
常用的命令其实是有两部分的:
- shell 语法中的命令
- 系统命令
关于第一条,应该看一下 shell(主要指 bash) 语言本身的关键词,其中有一个重点的概念要说一下:jobs
- jobs 指的是当前终端中后台运行的任务
- 具体来说,就是运行的时候用了 & 让他后台运行
- 退出的时候,jobs 中的进程会被停止
- 使用 Ctrl-z,fg,bg,kill 切换进程状态
- 使用 nohup 启动不会随着终端退出的进程
- 使用 disown 处理已经在运行的进程,让他不随终端退出而退出
运行一个持续的命令,比如 ping baidu.com
,会一直运行,这时候按 Ctrl-Z,此进程会被挂起
$ jobs
[1]+ Stopped ping baidu.com
这个时候啊,进程并没有杀掉,用 kill 来杀。可以看到进程前面那个数字是 1,用 %1 来代替这个进程
kill %1
当然,杀死的信号分 1-9 级,9 是不多 BB,直接杀,谨慎使用
kill -9 %1
运行下会出现类似提示
[1]+ Terminated ping baidu.com
注意 按了 Ctrl-Z 之后,进程并未在后台运行,而是被挂起了,状态是Stopped
要是想让他在当前终端的后台运行的话,应该用 bg 命令
$ bg %1
$ jobs
[1]+ Running ping baidu.com &
可以看到一堆输出到屏幕上的信息,这表明进程是在运行的。
以上的三步操作ping baidu.com -> Ctrl-Z -> bg %1
其实等效于运行 ping baidu.com &
这里的进程虽然是后台,但还是指终端的后台,会随着终端退出而退出
好吧,有时候,也想再把它调到前台
fg %1
对挂起的进程也有效
当前终端退出的时候, jobs 里面能看到的所有进程都会退出
这很多时候不满足我们的预期
推荐一篇文章,更详细的描述了各种解决方案
这里简单说下 nohup
个人平时用 nohup 比较多
比如刚才的 ping,用 nohup 运行就是
nohup ping baidu.com &
查看下后台运行的进程
$ ps -efw | grep ping | grep baidu.com
root 32368 32346 0 21:58 pts/1 00:00:00 ping baidu.com
这句话的意思是看所有进程里面包含ping
关键词和baidu.com
关键词的进程
现在 exit 后,再进入终端,发现这个进程还是存在的
有几点要注意:
- 进程启动的时候要加 &
- nohup 启动的进程和名字一样,实际上是让进程忽略了 HUP 信号,也就是终端退出时会发送向进程的信号
- 默认的输出文件是 nohup.out,可以自己更改,并把错误流也重定向到相应文件,写法如
nohup ping baidu.com >/tmp/ping.log 2>&1 &
,其中>/tmp/ping.log
是指输出重定向到文件/tmp/ping.log
,2>&1
是指错误流(2)合并到输出流(1)