如何在后台运行Linux命令?

在 Linux 系统中,当我们执行一个命令或启动一个程序时,它默认会运行在前台,占据当前的终端会话。这不仅意味着要等待当前任务完成才能执行下一个命令,更棘手的是,一旦网络连接中断或关闭终端窗口,正在运行的任务也会随之终止。本文将详细介绍如何在 Linux 后台运行命令,让任务稳定运行,不再依赖终端会话。
1. 理解 Linux 进程的前台与后台
在 Linux 系统中,每个命令的执行都会创建一个或多个进程。当我们直接在终端执行命令时,该进程默认运行在前台(foreground)。这意味着:
- 终端会被该进程占用,无法执行其他命令;
- 必须等待当前命令执行完毕,才能输入新命令;
- 如果终端连接中断,进程通常会终止。
相比之下,后台进程(background process)则独立于终端运行,释放命令行界面供用户继续操作。这对于执行长时间任务(如数据备份、日志分析、大型文件传输等)尤为重要。
2. 后台进程管理常用命令
| 命令 | 任务 |
|---|---|
command & |
后台运行命令 |
echo $! |
获取最后后台任务的 PID |
command > /dev/null 2>&1 & |
屏蔽所有输出 |
jobs -l |
列出后台任务 |
fg %1 |
将任务调至前台 |
bg %1 |
在后台恢复暂停的任务 |
Ctrl+Z |
暂停前台进程 |
disown %1 |
移除任务的 shell 关联 |
nohup command & |
使用 nohup 运行 |
kill PID |
根据 PID 终止进程 |
3. 在后台运行命令
3.1 使用&符号
最简单的后台运行方式是在命令末尾添加&符号:
[root@yyzcdb81 ~]# ./backup_monitor.sh & [1] 1721 [root@yyzcdb81 ~]#
系统会返回两个数字:
- [1]:作业 ID(Job ID),仅在当前 shell 会话中有效
- 1721:进程 ID(PID),系统全局唯一标识
3.2 获取后台进程信息
[oracle@yyzcdb81 ~]$ ./expdp_hisdb.sh & [1] 2118 [oracle@yyzcdb81 ~]$ [oracle@yyzcdb81 ~]$ echo "后台进程 PID:$!" 后台进程 PID:2118 [oracle@yyzcdb81 ~]$
3.3 输出重定向
后台进程默认仍会向终端输出信息,干扰正常操作。建议将输出重定向:
# 标准实践:丢弃所有输出 $ ./expdp_hisdb.sh > /dev/null 2>&1 & # 或者保存到日志文件 $ ./expdp_hisdb.sh > expdp_hisdb.log 2>&1 &
注:> /dev/null丢弃标准输出2>&1将错误输出重定向到标准输出(已被丢弃),实现静默运行。
4. 管理后台作业
4.1 查看后台作业
使用 jobs 命令查看当前 shell 会话中的作业状态:
[oracle@yyzcdb81 ~]$ ./expdp_hisdb.sh > expdb_hisdb.log 2>&1 & [1] 2576 [oracle@yyzcdb81 ~]$ [oracle@yyzcdb81 ~]$ jobs -l [1]+ 2576 Running ./expdp_hisdb.sh > expdb_hisdb.log 2>&1 & [oracle@yyzcdb81 ~]$
输出字段说明:
- [1]:作业号,+表示最近操作过的作业,-表示次近的;
- 2576:进程 PID;
- 运行中/已停止:作业状态;
- 实际执行的命令。
4.2 前后台切换
# 将后台作业调至前台 $ fg %1 # 将暂停的作业在后台恢复运行 $ bg %2 # 终止后台进程 $ kill 2576 # 优雅终止 $ kill -9 2576 # 强制终止(谨慎使用)
5. 将前台进程移至后台
当忘记使用&运行命令时,可以动态将其移至后台:
(1)暂停进程:按下 Ctrl+Z
$ tar -czf backup.tar.gz /oradata/yyzcdb ^Z [1]+ 已停止 tar -czf backup.tar.gz /oradata/yyzcdb
(2)转为后台运行:
$ bg [1]+ tar -czf backup.tar.gz /oradata/yyzcdb &
6. 保持后台进程持续运行
这是运维工作中最关键的部分。默认情况下,退出 shell 会向所有子进程发送SIGHUP信号,导致进程终止。
6.1 使用 disown
disown 从 shell 的作业表中移除进程,使其不再接收 shell 信号:
$ ./my_task.sh & [1] 25341 $ disown %1 $ jobs -l # 确认作业已被移除
注意:disown 后进程仍在运行,但输出可能因终端关闭而产生错误。建议配合输出重定向使用:
$ ./my_task.sh > output.log 2>&1 & $ disown
6.2 使用 nohup
nohup命令让进程忽略SIGHUP信号,并自动处理输出:
$ nohup ./my_task.sh & nohup: 忽略输入并把输出追加到"nohup.out"
自定义输出文件:
$ nohup ./my_task.sh > mytask.log 2>&1 &
6.3 使用终端复用器(推荐方案)
对于需要交互的长期任务,screen 和 tmux 是更好的选择。
Screen 示例:
$ screen -S backup_session # 创建会话 $ ./interactive_backup.sh # 运行任务 # 按 Ctrl+A 然后按 D 分离会话 $ screen -r backup_session # 重新连接
Tmux 示例:
$ tmux new -s data_processing $ python process_data.py # 按 Ctrl+B 然后按 D 分离 $ tmux attach -t data_processing
7. 常见问题排查
7.1 “bg: no current job”
当前 shell 中没有暂停的作业。先使用Ctrl + Z暂停前台进程,或指定具体作业号bg %1。
7.2 “There are stopped jobs when closing terminal”
shell 警告存在暂停的作业。处理方式:
$ jobs -l # 查看暂停的作业 $ kill -9 %1 # 终止不需要的作业 # 或者 $ bg %1 && disown %1 # 后台运行并解除关联
7.3 “nohup: failed to open ‘nohup.out'”
当前目录无写入权限。解决方案:
$ cd /tmp && nohup ./script.sh & # 切换到可写目录 $ nohup ./script.sh > /tmp/output.log & # 指定输出路径
7.4 进程在退出 shell 后仍然终止
仅使用&无法防止SIGHUP信号,正确做法:
$ nohup ./script.sh & # 或者 $ ./script.sh & $ disown # 或者使用 screen/tmux
8. 最佳实践建议
- 日志记录:始终将输出重定向到日志文件,便于问题追踪;
- PID 管理:对重要进程记录 PID,便于后续管理;
- 资源监控:后台运行大量任务时,注意系统负载;
- 规范命名:使用 screen/tmux 时给会话起有意义的名称;
- 定期清理:及时清理不需要的后台进程,释放系统资源。
以上关于如何在后台运行Linux命令?的文章就介绍到这了,更多相关内容请搜索码云笔记以前的文章或继续浏览下面的相关文章,希望大家以后多多支持码云笔记。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 admin@mybj123.com 进行投诉反馈,一经查实,立即处理!
重要:如软件存在付费、会员、充值等,均属软件开发者或所属公司行为,与本站无关,网友需自行判断
码云笔记 » 如何在后台运行Linux命令?
微信
支付宝