Linux 进程前台后台切换与作业控制
【摘要】 进程前台/后台切换(一)前台进程当你在 shell 中启动一个程序时,默认它是前台进程。例如,执行 ./shella.sh,这个程序会一直占用终端命令行,直到执行完毕。在前台执行期间,你无法在该终端中输入其他命令,只能等待该程序结束。如果是在本地终端执行一些耗时操作,如大文件解压,或者连接到远程服务器执行脚本时,一旦本地网络中断,前台进程就会结束,这会带来诸多不便,需要重新执行。示例:打开终...
进程前台/后台切换
(一)前台进程
当你在 shell 中启动一个程序时,默认它是前台进程。例如,执行 ./shella.sh
,这个程序会一直占用终端命令行,直到执行完毕。在前台执行期间,你无法在该终端中输入其他命令,只能等待该程序结束。如果是在本地终端执行一些耗时操作,如大文件解压,或者连接到远程服务器执行脚本时,一旦本地网络中断,前台进程就会结束,这会带来诸多不便,需要重新执行。
示例:
- 打开终端。
- 执行命令
./shella.sh
。 - 程序会在前台运行,终端命令行被占用,直到程序执行完毕。
(二)后台进程
通过在命令后面添加 &
符号,可以将命令放到后台执行。例如 ./shella.sh &
,这样程序就会在后台运行,终端命令行会立即返回,你可以继续输入其他命令。使用 jobs
命令可以查看后台作业列表,添加 -l
选项时,会显示更详细的信息,如作业号、进程号等。
示例:
- 打开终端。
- 执行命令
./shella.sh &
。 - 程序会在后台运行,终端命令行立即返回。
- 执行
jobs
命令查看后台作业列表。 - 执行
jobs -l
命令查看更详细的后台作业信息。
输出示例:
[1] 12345 Running ./shella.sh &
其中 [1]
表示作业号为 1,12345
是进程号,Running
表示进程正在运行,./shella.sh &
是执行的命令。
作业控制命令
(一)fg 命令
使用 fg
命令可以将某个后台作业切换到前台。如果要将作业号为 1 的作业切换到前台,执行 fg %1
。这样,该作业就会在前台继续执行,终端命令行会被该作业占用,直到它执行完毕或者被再次放到后台。
示例:
- 执行
jobs
命令查看后台作业列表。 - 找到作业号为 1 的作业。
- 执行
fg %1
将该作业切换到前台。
(二)Ctrl + Z 组合键
当一个命令正在前台执行时,按下 Ctrl + Z
组合键,可以将其放到后台,并且处于暂停状态。此时,该作业不会继续执行,但也不会占用终端命令行,你可以继续在终端中输入其他命令。
示例:
- 执行一个前台命令,例如
./shella.sh
。 - 按下
Ctrl + Z
组合键。 - 该命令会被放到后台并暂停执行。
(三)bg 命令
对于在后台暂停的命令,使用 bg
命令可以让它在后台继续执行。例如,如果作业号为 1 的命令被暂停在后台,执行 bg %1
,它就会在后台恢复执行。
示例:
- 执行
jobs
命令查看后台作业列表。 - 找到作业号为 1 的暂停作业。
- 执行
bg %1
让该作业在后台继续执行。
(四)kill 命令
使用 kill
命令可以终止后台运行的程序。例如 kill %1
可以直接终止作业号为 1 的后台进程。需要注意的是,某些进程可能需要使用 kill -9
来强制终止,因为 -9
选项会发送 SIGKILL 信号,该信号不能被进程捕获和忽略。
示例:
- 执行
jobs
命令查看后台作业列表。 - 找到作业号为 1 的作业。
- 执行
kill %1
终止该作业。 - 如果需要强制终止,执行
kill -9 %1
。
进程优先级调整
(一)nice 命令
nice
命令用于在启动进程时设置其优先级。优先级范围通常是从 -20 到 19,默认值是 0。数值越小,优先级越高。普通用户只能设置大于等于 0 的优先级值,而 root 用户可以设置任意优先级值。例如,要以较低优先级(优先级值为 10)启动 ./myscript.sh
脚本,可以执行:
nice -n 10 ./myscript.sh
这样,该脚本在执行时会占用较少的 CPU 时间,适合在后台运行一些对实时性要求不高的任务,以免影响系统中其他重要任务的执行。
示例:
- 打开终端。
- 执行
nice -n 10 ./myscript.sh
。 - 该脚本会在较低优先级下运行。
(二)renice 命令
renice
命令用于调整正在运行的进程的优先级。例如,要将进程号为 12345 的进程优先级调整为 5,可以执行:
renice -n 5 -p 12345
这样,该进程的优先级就会被修改为 5。通过合理调整进程优先级,可以优化系统资源的分配,确保关键任务能够获得足够的 CPU 时间,同时让一些次要任务在后台以较低优先级运行,提高系统的整体性能和稳定性。
示例:
- 执行
ps
命令找到需要调整优先级的进程号,例如 12345。 - 执行
renice -n 5 -p 12345
。 - 该进程的优先级会被调整为 5。
优化建议
(一)合理使用后台运行
对于一些耗时较长且不需要实时交互的任务,如批量文件处理、数据备份等,建议使用 &
符号将其放到后台执行。这样可以避免长时间占用终端命令行,提高工作效率。同时,可以利用 jobs
命令随时查看后台作业的状态,根据需要使用 fg
、bg
等命令进行控制。
示例:
- 执行
./long_running_task.sh &
将耗时任务放到后台运行。 - 使用
jobs
命令查看后台作业状态。 - 根据需要使用
fg
或bg
命令控制作业。
(二)防止输出丢失
当需要在后台运行一些会产生输出的命令时,为了避免输出丢失,可以使用 nohup
命令。例如:
nohup ./myscript.sh &
这样,即使退出当前终端,./myscript.sh
脚本仍会在后台运行,并且其输出会被追加到 nohup.out
文件中(默认情况下)。你可以随时查看 nohup.out
文件来获取脚本的输出结果。此外,也可以将输出重定向到指定的文件,例如:
nohup ./myscript.sh > output.log 2>&1 &
2>&1
这是错误重定向操作符。
2
代表标准错误(即程序的错误输出内容),&1
代表标准输出。2>&1
的意思是将标准错误重定向到标准输出。由于标准输出已经被重定向到 output.log
文件中,因此标准错误也会被重定向到 output.log
文件中。这样,无论是正常输出还是错误输出,都会被记录到 output.log
文件中。
示例:
- 执行
nohup ./myscript.sh &
。 - 退出终端。
- 重新打开终端,查看
nohup.out
或output.log
文件获取输出结果。
(三)定期检查与清理后台作业
在长时间使用终端进行多任务操作时,后台可能会积累大量的作业。定期使用 jobs
命令检查后台作业列表,对于已经完成或者不再需要的作业,及时使用 kill
命令进行清理。这有助于释放系统资源,避免后台作业过多导致系统性能下降。
示例:
- 执行
jobs
命令查看后台作业列表。 - 找到已经完成或不再需要的作业。
- 执行
kill %作业号
清理该作业。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)