Linux 进程前台后台切换与作业控制

举报
久绊A 发表于 2025/03/03 00:08:40 2025/03/03
29 0 0
【摘要】 进程前台/后台切换(一)前台进程当你在 shell 中启动一个程序时,默认它是前台进程。例如,执行 ./shella.sh,这个程序会一直占用终端命令行,直到执行完毕。在前台执行期间,你无法在该终端中输入其他命令,只能等待该程序结束。如果是在本地终端执行一些耗时操作,如大文件解压,或者连接到远程服务器执行脚本时,一旦本地网络中断,前台进程就会结束,这会带来诸多不便,需要重新执行。示例:打开终...

进程前台/后台切换

(一)前台进程

当你在 shell 中启动一个程序时,默认它是前台进程。例如,执行 ./shella.sh,这个程序会一直占用终端命令行,直到执行完毕。在前台执行期间,你无法在该终端中输入其他命令,只能等待该程序结束。如果是在本地终端执行一些耗时操作,如大文件解压,或者连接到远程服务器执行脚本时,一旦本地网络中断,前台进程就会结束,这会带来诸多不便,需要重新执行。

示例:

  1. 打开终端。
  2. 执行命令 ./shella.sh
  3. 程序会在前台运行,终端命令行被占用,直到程序执行完毕。

(二)后台进程

通过在命令后面添加 & 符号,可以将命令放到后台执行。例如 ./shella.sh &,这样程序就会在后台运行,终端命令行会立即返回,你可以继续输入其他命令。使用 jobs 命令可以查看后台作业列表,添加 -l 选项时,会显示更详细的信息,如作业号、进程号等。

示例:

  1. 打开终端。
  2. 执行命令 ./shella.sh &
  3. 程序会在后台运行,终端命令行立即返回。
  4. 执行 jobs 命令查看后台作业列表。
  5. 执行 jobs -l 命令查看更详细的后台作业信息。

输出示例:

[1] 12345 Running ./shella.sh &

其中 [1] 表示作业号为 1,12345 是进程号,Running 表示进程正在运行,./shella.sh & 是执行的命令。

作业控制命令

(一)fg 命令

使用 fg 命令可以将某个后台作业切换到前台。如果要将作业号为 1 的作业切换到前台,执行 fg %1。这样,该作业就会在前台继续执行,终端命令行会被该作业占用,直到它执行完毕或者被再次放到后台。

示例:

  1. 执行 jobs 命令查看后台作业列表。
  2. 找到作业号为 1 的作业。
  3. 执行 fg %1 将该作业切换到前台。

(二)Ctrl + Z 组合键

当一个命令正在前台执行时,按下 Ctrl + Z 组合键,可以将其放到后台,并且处于暂停状态。此时,该作业不会继续执行,但也不会占用终端命令行,你可以继续在终端中输入其他命令。

示例:

  1. 执行一个前台命令,例如 ./shella.sh
  2. 按下 Ctrl + Z 组合键。
  3. 该命令会被放到后台并暂停执行。

(三)bg 命令

对于在后台暂停的命令,使用 bg 命令可以让它在后台继续执行。例如,如果作业号为 1 的命令被暂停在后台,执行 bg %1,它就会在后台恢复执行。

示例:

  1. 执行 jobs 命令查看后台作业列表。
  2. 找到作业号为 1 的暂停作业。
  3. 执行 bg %1 让该作业在后台继续执行。

(四)kill 命令

使用 kill 命令可以终止后台运行的程序。例如 kill %1 可以直接终止作业号为 1 的后台进程。需要注意的是,某些进程可能需要使用 kill -9 来强制终止,因为 -9 选项会发送 SIGKILL 信号,该信号不能被进程捕获和忽略。

示例:

  1. 执行 jobs 命令查看后台作业列表。
  2. 找到作业号为 1 的作业。
  3. 执行 kill %1 终止该作业。
  4. 如果需要强制终止,执行 kill -9 %1

进程优先级调整

(一)nice 命令

nice 命令用于在启动进程时设置其优先级。优先级范围通常是从 -20 到 19,默认值是 0。数值越小,优先级越高。普通用户只能设置大于等于 0 的优先级值,而 root 用户可以设置任意优先级值。例如,要以较低优先级(优先级值为 10)启动 ./myscript.sh 脚本,可以执行:

nice -n 10 ./myscript.sh

这样,该脚本在执行时会占用较少的 CPU 时间,适合在后台运行一些对实时性要求不高的任务,以免影响系统中其他重要任务的执行。

示例:

  1. 打开终端。
  2. 执行 nice -n 10 ./myscript.sh
  3. 该脚本会在较低优先级下运行。

(二)renice 命令

renice 命令用于调整正在运行的进程的优先级。例如,要将进程号为 12345 的进程优先级调整为 5,可以执行:

renice -n 5 -p 12345

这样,该进程的优先级就会被修改为 5。通过合理调整进程优先级,可以优化系统资源的分配,确保关键任务能够获得足够的 CPU 时间,同时让一些次要任务在后台以较低优先级运行,提高系统的整体性能和稳定性。

示例:

  1. 执行 ps 命令找到需要调整优先级的进程号,例如 12345。
  2. 执行 renice -n 5 -p 12345
  3. 该进程的优先级会被调整为 5。

优化建议

(一)合理使用后台运行

对于一些耗时较长且不需要实时交互的任务,如批量文件处理、数据备份等,建议使用 & 符号将其放到后台执行。这样可以避免长时间占用终端命令行,提高工作效率。同时,可以利用 jobs 命令随时查看后台作业的状态,根据需要使用 fgbg 等命令进行控制。

示例:

  1. 执行 ./long_running_task.sh & 将耗时任务放到后台运行。
  2. 使用 jobs 命令查看后台作业状态。
  3. 根据需要使用 fgbg 命令控制作业。

(二)防止输出丢失

当需要在后台运行一些会产生输出的命令时,为了避免输出丢失,可以使用 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 文件中。

示例:

  1. 执行 nohup ./myscript.sh &
  2. 退出终端。
  3. 重新打开终端,查看 nohup.outoutput.log 文件获取输出结果。

(三)定期检查与清理后台作业

在长时间使用终端进行多任务操作时,后台可能会积累大量的作业。定期使用 jobs 命令检查后台作业列表,对于已经完成或者不再需要的作业,及时使用 kill 命令进行清理。这有助于释放系统资源,避免后台作业过多导致系统性能下降。

示例:

  1. 执行 jobs 命令查看后台作业列表。
  2. 找到已经完成或不再需要的作业。
  3. 执行 kill %作业号 清理该作业。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。