赞
踩
讲后台运行之前,先说一下重定向;
文件描述符
当执行shell命令时,会默认打开3个文件,每个文件有对应的文件描述符来方便我们使用:
类型 | 文件描述符 | 默认情况 | 对应文件句柄位置 |
---|---|---|---|
标准输入(standard input) | 0 | 从键盘获得输入 | /proc/slef/fd/0 |
标准输出(standard output) | 1 | 输出到屏幕(即控制台) | /proc/slef/fd/1 |
错误输出(error output) | 2 | 输出到屏幕(即控制台) | /proc/slef/fd/2 |
所以我们平时在执行shell命令中,都默认是从键盘获得输入,并且将结果输出到控制台上。但是我们可以通过更改文件描述符默认的指向,从而实现输入输出的重定向。比如我们将1指向文件,那么标准的输出就会输出到文件中。
重定向符号:> 和>>
当使用>时,会判断右边的文件存不存在,如果存在的话就先删除,然后创建一个新的文件,不存在的话则直接创建, 缺省
条件下为标准输出。
但是当使用>>进行追加时,则不会删除原来已经存在的文件,而是在原文件后面进行追加内容。
2>1 与 2>&1 的区别
2>1, 把标准错误stderr重定向到文件1中
2>&1
,把标准错误stderr重定向到标准输出stdout,说人话就是错误输出将会和标准输出输出到同一个地方。
>/dev/null
这条命令的作用是将标准输出1重定向到/dev/null
中。/dev/null
代表linux的空设备文件,所有往这个文件里面写入的内容都会丢失,俗称“垃圾桶”。那么执行了>/dev/null
之后,标准输出就会不再存在,没有任何地方能够找到输出的内容。
>/dev/null 2>&1 和 2>&1 >/dev/null的区别
命令 | 标准输出 | 错误输出 |
---|---|---|
>/dev/null 2>&1 | 丢弃 | 丢弃 |
2>&1 >/dev/null | 丢弃 | 屏幕 |
写个简单的测试程序1.c
:
#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
int cnt = 0;
while (1) {
printf("hello world %d\n", cnt++);
sleep(1);
}
return 0;
}
&
的意思是在后台运行, 什么意思呢? 意思是说, 当你在执行 ./a.out &
的时候, 即使你用ctrl C, 那么a.out照样运行(因为对SIGINT信号免疫)。 但是要注意, 如果你直接关掉shell后, 那么, a.out进程同样消失。 可见, &的后台并不硬(因为对SIGHUP信号不免疫),或者使用killall -9 a.out
来关闭进程。
如果你正在运行一个进程,而且你觉得在退出帐户时该进程还不会结束,那么可以使用nohup
命令。该命令可以在你退出帐户/关闭终端之后继续运行相应的进程。nohup就是不挂起的意思( n ohang up)。
nohup
的意思是忽略SIGHUP信号, 所以当运行nohup ./a.out
的时候, 关闭shell, 那么a.out进程还是存在的(对SIGHUP信号免疫)。 但是, 要注意, 如果你直接在shell中用Ctrl C, 那么, a.out进程也是会消失的(因为对SIGINT信号不免疫)
一般我们要让进程真正不受shell中Ctrl C和shell关闭的影响, 那该怎么办呢? 那就用nohup ./a.out &
,
这时候要关闭a.out后台进程,只能使用killall -9 a.out
用disown -h jobspec 来使某个作业忽略HUP信号。
用disown -ah 来使所有的作业都忽略HUP信号。
用disown -rh 来使正在运行的作业忽略HUP信号。
以上两种方式,都是提交命令时才能使用。但是如果我们未加任何处理就已经提交了命令,该如何补救呢?
答案就是用 Ctrl-z
了!
在我们的日常工作中,我们可以用 CTRL-z
来将当前进程挂起到后台暂停运行
,执行一些别的操作,然后再用 fg
来将后台的进程重新放回前台(也可用 bg
来将挂起的进程放在后台)继续运行。这样我们就可以在一个终端内灵活切换运行多个任务,这一点在调试代码时尤为有用。因为将代码编辑器挂起到后台再重新放回时,光标定位仍然停留在上次挂起时的位置,避免了重新定位的麻烦。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。