linux进程后台运行

重定向

讲后台运行之前,先说一下重定向;

文件描述符
当执行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命令。该命令可以在你退出帐户/关闭终端之后继续运行相应的进程。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和Ctrl + z

用disown -h jobspec 来使某个作业忽略HUP信号。
用disown -ah 来使所有的作业都忽略HUP信号。
用disown -rh 来使正在运行的作业忽略HUP信号。

以上两种方式,都是提交命令时才能使用。但是如果我们未加任何处理就已经提交了命令,该如何补救呢?
答案就是用 Ctrl-z了!
在我们的日常工作中,我们可以用 CTRL-z 来将当前进程挂起到后台暂停运行,执行一些别的操作,然后再用 fg 来将后台的进程重新放回前台(也可用 bg 来将挂起的进程放在后台)继续运行。这样我们就可以在一个终端内灵活切换运行多个任务,这一点在调试代码时尤为有用。因为将代码编辑器挂起到后台再重新放回时,光标定位仍然停留在上次挂起时的位置,避免了重新定位的麻烦。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值