nohup and &

&

& 的意思是在后台运行,什么意思呢?意思是说,当你在执行 ./a.out & 的时候,即使你用 ctrl C, 那么 a.out 照样运行(因为对 SIGINT 信号免疫)。但是要注意, 如果你直接关掉 shell 后, 那么,a.out 进程同样消失。可见, & 的后台并不硬(因为对 SIGHUP 信号不免疫)。

nohup

nohup 的意思是忽略 SIGHUP 信号,所以当运行 nohup ./a.out 的时候,关闭 shell, 那么 a.out 进程还是存在的(对 SIGHUP 信号免疫)。但是,要注意,如果你直接在 shell 中用 Ctrl C,那么,a.out 进程也是会消失的(因为对 SIGINT 信号不免疫)

nohup , &

所以,& 和 nohup 没有半毛钱的关系,要让进程真正不受 shell 中 Ctrl C 和 shell 关闭的影响, 那该怎么办呢?那就用 nohup ./a.out & 吧, 两全其美。

/dev/null and > override

override and append

  • > 代表override
  • >> 代表append

/dev/null

  • 可以将 /dev/null 看作"黑洞"。 它非常等价于一个只写文件,所有写入它的内容都会永远丢失。而尝试从它那儿读取内容则什么也读不到。然而,/dev/null 对命令行和脚本都非常的有用。

用处:

  • 禁止标准输出 command 1>/dev/null stdout 被遗弃
  • 禁止标准错误 command 2>/dev/null stderr 被遗弃

command 1>/dev/null 2>&1

解读 1>/dev/null 2>&1 分为两部分

  • 1 表示stdout标准输出,系统默认值是1,所以
    • command>/dev/null 等同于 command 1>/dev/null
    • command 1>/dev/null 2>&1 等同于 command>/dev/null 2>&1
  • 2 表示stderr标准错误
  • & 表示等同于的意思,2>&1,表示2的输出重定向等同于1