shell的后台运行(&)与nohup
简述
在shell脚本中当我们需要把一个任务放在后台运行时,通常我们会使用&符号:
subcommand &
此时主进程会继续往下执行,而子进程会在后台启动运行。
于此同时,我们常会看到nohup会和后台任务一起使用,格式是:
nohup subcommand &
nohup在这里起了什么角色呢。
nohup
nohup起两个作用:
正如名字所声称的,忽略所有发送给子命令的挂断(SIGHUP)信号
nohup subcommand &
这样所有发给subcommand的SIGHUP信号都被忽略,subcommand就不会收到SIGHUP信号。
什么是SIGHUP信号呢?
简单的理解可以是终端结束时,操作系统会发送SIGHUP信号到后台进程。
重定向子命令的标准输出(stdout)和标准错误(stderr)
我们可以在终端看到如下输出:
nohup: appending output to "nohup.out"
表示subcommand的标准输出和标准错误被重定向到nohup.out文件;如果没有使用nohup方式,则subcommand的标准输出和标准错误是复用父进程的标准输出和标准错误。
举例
例子1:后台运行(&)
$ cat testshell0.sh
#!/bin/bash
#trap "echo \"SIGHUP is received\""