在 Shell 脚本中,& 符号用于将命令置于后台运行,这是一个非常重要的并发控制工具。下面详细解释它的用法和特性:
基本语法
command &
主要特性
1. 立即返回控制权
# 前台运行 - 会阻塞终端
sleep 10
# 后台运行 - 立即返回提示符
sleep 10 &
2. 输出示例
$ sleep 30 &
[1] 12345 # [作业号] 进程ID
实际应用场景
1. 并行执行多个任务
#!/bin/bash
# 同时下载多个文件
wget http://example.com/file1.zip &
wget http://example.com/file2.zip &
wget http://example.com/file3.zip &
# 等待所有后台任务完成
wait
echo "所有下载完成"
2. 服务启动脚本
#!/bin/bash
# 启动多个服务
nginx &
redis-server &
mysql &
echo "所有服务已启动"
3. 长时间任务处理
#!/bin/bash
# 后台处理大文件
process_large_file.sh &
echo "文件处理任务已在后台启动,PID: $!"
# 继续执行其他任务
generate_report.sh
相关命令和操作
1. 查看后台作业
jobs # 查看当前作业
jobs -l # 显示详细信息,包括PID
2. 作业控制
# 将后台作业调到前台
fg %1
# 将前台作业暂停并放到后台
Ctrl + Z # 暂停
bg %1 # 后台继续运行
# 终止后台作业
kill %1 # 通过作业号
kill 12345 # 通过进程ID
3. 等待命令
#!/bin/bash
task1.sh &
pid1=$!
task2.sh &
pid2=$!
# 等待特定进程结束
wait $pid1
echo "任务1已完成"
# 等待所有后台进程结束
wait
echo "所有任务已完成"
高级用法
1. 后台命令组
# 在子shell中运行多个命令
{
command1
command2
command3
} &
# 或者使用小括号(创建子shell)
(command1; command2; command3) &
2. 忽略挂起信号
# 使用 nohup 防止进程因终端关闭而终止
nohup command &

3. 输出重定向
# 重定向后台任务的输出
command > output.log 2>&1 &
# 丢弃输出
command > /dev/null 2>&1 &
完整示例脚本
#!/bin/bash
# 并行处理示例
echo "开始并行处理任务..."
# 启动多个后台任务
process_data.sh "file1.csv" > output1.log 2>&1 &
pid1=$!
echo "启动任务1, PID: $pid1"
process_data.sh "file2.csv" > output2.log 2>&1 &
pid2=$!
echo "启动任务2, PID: $pid2"
process_data.sh "file3.csv" > output3.log 2>&1 &
pid3=$!
echo "启动任务3, PID: $pid3"
# 显示当前作业
echo "当前后台作业:"
jobs
# 等待所有任务完成
echo "等待任务完成..."
wait
echo "所有并行任务已完成"
注意事项
-
输出混合:多个后台任务的输出可能会混合在一起
-
终端依赖:默认情况下,关闭终端会终止后台进程
-
资源竞争:需要注意资源争用和负载问题
-
错误处理:后台进程的错误可能不易察觉
最佳实践
#!/bin/bash
# 推荐的后台任务管理方式
# 1. 记录PID
some_task &
TASK_PID=$!
# 2. 重定向输出
another_task > /var/log/task.log 2>&1 &
# 3. 使用nohup防止意外终止
nohup long_running_task > /dev/null 2>&1 &
# 4. 适当等待
wait
# 5. 清理资源
kill $TASK_PID 2>/dev/null
& 符号是 Shell 脚本中实现并发编程的基础工具,合理使用可以显著提高脚本的执行效率。

104

被折叠的 条评论
为什么被折叠?



