记录总结一下 Linux 中 fg、bg、jobs、&、ctrl + z 等相关指令对任务进程的操作。
一、基本用法
1.1 & 和 jobs 指令
& 用在一个命令的最后,可以把这个命令转换为后台运行的任务进程。
jobs 查看当前终端有多少在后台运行的进程。
jobs 命令执行的结果,+ 表示是一个当前的作业,- 减号表示是一个当前作业之后的一个作业。
jobs -l 选项可显示所有任务的进程号 pid
jobs 的状态可以是 running,stopped,terminated。但是如果任务进程被终止了(kill),当前的终端环境中也就删除了任务的进程标识;也就是说 jobs 命令显示的是当前 shell 环境中后台正在运行或者被挂起的任务进程信息
1.2 fg 和 bg 指令
fg 将后台任务进程调至前台继续运行,如果后台中有多个任务进程,可以用 fg %num 将选中的任务进程调至前台。
bg 将挂起的任务进程重新启动运行,如果有多个暂停的任务进程,可以用 bg %num 将选中的任务进程启动运行。
%num 是通过 jobs 命令查到的后台正在执行的任务的序号(不是 pid)
二、进程的挂起
2.1 后台进程的挂起
在 solaris 中通过 stop 命令执行,通过 jobs 命令查看任务号(假设为 num),然后执行:stop %num
在 redhat 中,不存在 stop 命令,可通过执行命令 kill -stop PID,将进程挂起
2.2 前台进程的挂起
ctrl + z:可以将一个正在前台执行的任务放到后台运行,并且挂起
三、挂起进程重新运行
通过 bg %num 即可将挂起的任务进程的状态由 stopped 改为 running,仍在后台运行
通过 fg %num 即可将挂起的任务进程转为前台执行
四、进程的终止
4.1 后台进程的终止
方法一: 通过 jobs 命令查看任务号(假设为 num),然后执行:kill %num
方法二: 通过 ps 命令查看任务的进程号(PID,假设为 pid),然后执行:kill pid
4.2 前台进程的终止
执行 ctrl+c 即可终止前台执行任务进程
假设要后台运行 xmms,可通过命令:xmms &。但万一你运行程序时忘记使用 & 了,又不想重新执行,你可以先使用 ctrl+z 挂起任务进程,然后敲入bg 命令,这样任务进程就在后台继续运行了
五、进程永久执行
nohup 不挂断地运行命令
1 | nohup Command [ Arg ... ] [ & ] |
nohup 命令运行由 Command 参数和任何相关的 Arg 参数指定的命令,忽略所有挂断(SIGHUP)信号。在注销后使用 nohup 命令运行后台中的程序。要运行后台中的 nohup 命令,添加 & ( 表示“and”的符号)到命令的尾部。
无论是否将 nohup 命令的输出重定向到终端,输出都将附加到当前目录的 nohup.out 文件中。如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。如果没有文件能创建或打开以用于追加,那么 Command 参数指定的命令不可调用。如果标准错误是一个终端,那么把指定的命令写给标准错误的所有输出作为标准输出重定向到相同的文件描述符。
六、SIGHUP信号
用户退出 session 以后,”后台任务”是否还会继续执行?Linux系统是这样设计的:
- 用户准备退出 session
- 系统向该 session 发出SIGHUP信号
- session 将SIGHUP信号发给所有子进程
- 子进程收到SIGHUP信号后,自动退出
上面的流程解释了,为什么”前台任务”会随着 session 的退出而退出:因为它收到了SIGHUP信号。
那么,”后台任务”是否也会收到SIGHUP信号?这由 Shell 的huponexit参数决定的。
1 | shopt | grep huponexit |
执行上面的命令,就会看到huponexit参数的值。
大多数Linux系统,这个参数默认关闭(off)。因此,session 退出的时候,**不会把SIGHUP信号发给”后台任务”**。所以,一般来说,”后台任务”不会随着 session 一起退出。