# Linux后台运行程序与后台任务管理
在Linux中任何命令或者脚本都可以在后台运行,本文介绍一下如何让一个脚本在后台运行以及如何管理后台任务。
## 0. 管理后台程序
刚开始用Linux的时候,总会觉得终端开多少都不够用,那是因为每个作业都会占据一个终端。其实Linux提供了很方便的后台程序管理方法。
**0. 挂起**
当一个作业运行时间很长时,可以通过Ctrl+z把该作业挂起。这其实就是给终端发送了一个hangup信号。可以看到:```[1]+ Stopped ./command.sh```这就意味着该作业已经别挂起了,作业任务号是1.
**1. 后台运行**
输入命令```bg 1```,可以让任务号为1的作业在后台运行。屏幕上输出:```[1]+ ./command.sh &```说明任务号为1的作业已经在后台运行了。
**2. 查看后台运行的作业**
输入命令```jobs -l```,可以查看后台运行的作业,屏幕上输出:
- **[1]+ Running ./command.sh &**,说明任务号为1的作业正在后台运行。
- **[1]+ Stopped ./command.sh &**,说明任务号为1的作业已经在后台挂起。
**3. 将后台运行的作业调往前台**
输入命令```fg 1```,可以将任务号为1的后台作业调往前台运行。屏幕上输出:```./command.sh```说明该作业正在前台运行,且占据了终端。
## 1. 运行后台程序
运行后台程序有两种方式,&符号和nohup命令:
1. ```command &```: 后台运行command命令
2. ```nohup command &```: 也是后台运行command命令。nohup是*no hangup*的意思,忽略*hangup*信号,也就是Shell窗口关闭和账户logout都不能终止command命令。
### 1.1 &符号
Linux中运行程序时,终端会被作业占据,可以使用&符号把作业放在后台运行,例如:
```
$ ./command.sh &
[1] 3860
```
输入命令```command.sh &```就把command程序放在后台运行了。终端会输出```[任务号] 进程号```,该作业的任务号为1,进程号为3860.
**需要用户交互的作业怎么放到后台?**
后台执行作业时有时需要用户交互,比如需要输出或者输入。如果按照上面的方式直接放到后台运行,作业会在后台一直等着,这样的话作业是执行不完,因为它在等着输出或者输入呢。**这种时候就需要重定向,将标准输出、标准错误和标准输入重定向到其他文件。**
- ```command >/the/path/out.file &```,把command命令的标准输出重定向到了*/the/path/out.file*。
- ```command >/the/path/out.file 2>&1 &```,把command命令的标准输出和标准错误重定向到了*/the/path/out.file*。
- ```command /the/path/out.file 2>&1 &```,把command命令的标准输入重定向到了*/the/path/file.in*,同时把标准输出和标准错误重定向到了*/the/path/out.file*。
- ```command <&- >/the/path/out.file 2>&1 &```,关闭了command命令的标准输入,同时把标准输出和标准错误重定向到了*/the/path/out.file*。
## nohup命令
**使用&符号已经能够在后台执行作业,为什么需要在前面加上nohup命令呢?**
&符号运行的后台作业会受到hangup信号的干扰,从而关闭该后台作业的进程。在Linux系统中,用户注销和网络断开,都会给终端发送hangup信号,通知其关闭所有子进程。**而nohup命令可以让后台作业忽略hangup信号。**
输入命令```nohup conmmand &```,就可以让command在后台运行,且忽略hangup信号。那么在缺省情况下该作业的所有输出都被重定向到一个名为nohup.out的文件中。
也可以自定义输出文件,例如```nohup command > myfile.out 2>&1 ```,标准输出和标准错误都被重定向到myfile.out。