exec 介绍

exec是 Linux/Unix 系统中一个极其重要但又容易误解的命令。它不是执行新命令,而是用指定命令替换当前进程

📚exec 的核心概念

与传统命令执行的区别

# 正常执行命令:创建子进程 $ ls # shell创建子进程运行ls,ls结束返回shell # exec执行命令:替换当前进程 $ exec ls # 当前shell进程被ls替换,ls结束整个会话结束!

🎯一、基本语法和效果

1. 替换当前shell进程

# 执行后终端会退出! exec /bin/bash # 用新的bash替换当前bash exec zsh # 切换到zsh(当前会话结束) # 危险示例:执行后会退出终端! exec echo "再见" # 显示"再见"然后终端关闭

2. 在脚本中的使用

#!/bin/bash # test_exec.sh echo "脚本开始,PID: $$" # 用ls替换当前bash进程 exec ls -l echo "这行永远不会执行!" # 因为exec已经替换了进程

🔄二、主要用途

1. 切换Shell(最常用)

# 从bash切换到zsh exec zsh # 从zsh切回bash exec bash # 切换到精简shell(用于受限环境) exec sh # 查看效果 echo "切换前Shell: $SHELL, PID: $$" exec bash -c 'echo "新Shell PID: $$"'

2. 重定向所有后续输出

# 将脚本所有输出重定向到文件 exec > output.log 2>&1 echo "这行写入文件" ls /nonexistent # 错误也写入文件 date # 恢复标准输出(需要先保存) exec 3>&1 # 将文件描述符3指向标准输出 exec > file.log # 标准输出重定向到文件 echo "到文件" exec >&3 # 恢复标准输出 echo "到屏幕" # 简洁写法 exec 2>> error.log # 只重定向错误输出到文件(追加)

3. 在脚本中执行最后命令(优化资源)

#!/bin/bash # 传统脚本:有子进程开销 setup_environment() { export PATH="/app/bin:$PATH" # 其他初始化... } setup_environment python main.py # 创建子进程执行python # 使用exec优化:无子进程开销 setup_environment exec python main.py # 直接替换当前进程为python

三、高级重定向技巧

1. 文件描述符操作

# 创建自定义文件描述符 exec 3<> /tmp/file # 打开文件用于读写 echo "test" >&3 # 写入文件描述符3 cat <&3 # 从文件描述符3读取 exec 3>&- # 关闭文件描述符3 # 备份和恢复标准输出 exec 100>&1 # 备份标准输出到描述符100 exec 1> /tmp/out # 重定向标准输出 echo "到文件" exec 1>&100 # 恢复标准输出 exec 100>&- # 关闭备份描述符

2. 网络重定向

# 重定向到网络套接字 exec 3<>/dev/tcp/google.com/80 echo -e "GET / HTTP/1.1\nHost: google.com\n\n" >&3 cat <&3 exec 3>&- # UDP示例 exec 3<>/dev/udp/8.8.8.8/53

3. 输入重定向

# 从字符串读取输入 exec <<< "Hello World" read line echo "读取到: $line" # 输出: Hello World # 多行输入 exec << 'EOF' 第一行数据 第二行数据 第三行数据 EOF while read line; do echo "行: $line" done

🔧四、实际应用场景

1. Docker容器启动脚本

# Dockerfile典型用法 COPY entrypoint.sh /entrypoint.sh RUN chmod +x /entrypoint.sh ENTRYPOINT ["/entrypoint.sh"] # entrypoint.sh内容 #!/bin/bash # 初始化 /app/init.sh # 用主进程替换shell(PID 1) exec /app/main --config /app/config.yaml

优点

  • 主进程成为PID 1,能正常接收信号
  • 无shell进程开销
  • 容器日志是应用直接输出

2. 安全包装脚本

#!/bin/bash # secure_wrapper.sh # 限制资源后运行程序 ulimit -c 0 # 禁用core dump ulimit -t 60 # 最多运行60秒 ulimit -v 50000 # 限制虚拟内存 # 切换到安全目录 cd /safe/directory # 丢弃特权(如果有) if [ "$EUID" -eq 0 ]; then exec su nobody -c "/app/program $@" else exec /app/program "$@" fi

3. 登录Shell定制

# ~/.bash_profile 或 ~/.zprofile if [[ -f ~/.env ]]; then source ~/.env fi # 如果是ssh登录且不需要交互,直接运行命令 if [[ -n "$SSH_ORIGINAL_COMMAND" ]]; then exec $SHELL -c "$SSH_ORIGINAL_COMMAND" fi # 正常登录则继续 echo "欢迎登录!"

4. 服务启动脚本

#!/bin/bash # /etc/init.d/myapp case "$1" in start) echo "启动myapp..." cd /opt/myapp # 后台运行,但通过exec让进程独立 exec /opt/myapp/bin/server \ --config /etc/myapp.conf \ >> /var/log/myapp.log 2>&1 & ;; stop) killall server ;; esac

⚙️五、特殊技巧

1. 永久重定向脚本输出

#!/bin/bash # 整个脚本输出到日志 exec > >(tee -a /var/log/myscript.log) 2>&1 echo "开始运行" some_command another_command echo "运行结束"

2. 创建匿名管道

# 使用exec创建进程间通信 exec 3< <(echo "管道数据"; sleep 5; echo "更多数据") cat <&3 & # 后台读取 exec 3>&- # 关闭

3. 模拟daemonize

#!/bin/bash # 简易的守护进程化 cd / umask 0 exec > /dev/null 2>&1 exec setsid "$0" "$@" & # 实际主程序 while true; do /app/daemon_work.sh sleep 60 done

⚠️六、注意事项和陷阱

1. 不能恢复的执行

# 错误示例 exec ls echo "这行不会执行" # 因为进程已经被ls替换 # 正确做法:需要恢复时不要用exec ls echo "这行会执行"

2. 信号处理问题

# exec会继承信号处理器,但替换程序可能不处理 trap 'echo 收到信号' INT exec sleep 60 # sleep不会响应Ctrl+C的自定义处理 # 解决方案 exec bash -c 'trap "" INT; sleep 60'

3. 环境变量传递

# exec会继承当前环境 export MY_VAR="value" exec env | grep MY_VAR # 会显示MY_VAR=value # 但新进程可以覆盖 exec env -i /bin/bash # 启动干净环境的bash

4. 与source命令的区别

# source (.): 在当前shell执行脚本 source config.sh # config.sh的变量在当前shell生效 # exec: 替换整个shell exec bash # 全新bash,之前的环境可能丢失

📋七、exec vs 直接执行

对比表格

场景直接执行exec执行
进程关系创建子进程替换当前进程
PID子进程新PID保持原PID
返回控制命令结束返回shell命令结束进程结束
资源有shell内存开销无额外开销
信号shell可处理信号直接传给命令
环境可继承可修改完全继承

性能测试

# 测试子进程开销 time for i in {1..1000}; do /bin/true; done # 真实时间: 约0.8秒 # 测试exec开销(实际不可行,因为会退出) # 但概念上exec更快,因为不创建新进程

💡八、实用模式总结

1. 包装器模式

#!/bin/bash # wrapper.sh setup() { # 初始化环境 } cleanup() { # 清理工作 } setup trap cleanup EXIT exec "$@" # 执行传入的所有参数作为命令

2. 透明替换模式

# 替换常用命令增加功能 alias ls='exec /usr/local/bin/ls_enhanced' # ls_enhanced可以记录日志、添加颜色等

3. 强制使用特定程序

# ~/.bashrc 中限制用户 if [[ "$USER" == "restricted" ]]; then exec /usr/bin/rbash # 受限bash fi

4. 单命令会话

# SSH强制单命令(authorized_keys) command="/usr/bin/exec /app/backup.sh" ssh-rsa ...

🎯何时使用exec?

应该使用exec的场景

1. Docker/supervisor启动脚本 2. 包装器脚本的最后一步 3. 需要PID 1特性的情况 4. 优化资源的关键路径 5. 永久重定向脚本输出

不应使用exec的场景

1. 需要返回原shell的交互命令 2. 脚本中还有后续命令要执行 3. 需要shell处理信号的情况 4. 不理解的场景(危险!)

记住核心exec"替换"不是"执行"。用得好可以优化性能和安全,用不好会导致会话意外退出。在脚本中使用时要特别小心!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1149713.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

9B参数多模态模型落地手机端|AutoGLM-Phone-9B工程化部署关键技术解析

9B参数多模态模型落地手机端&#xff5c;AutoGLM-Phone-9B工程化部署关键技术解析 1. AutoGLM-Phone-9B的核心架构与多模态融合机制 AutoGLM-Phone-9B 是一款专为移动端优化的多模态大语言模型&#xff0c;融合视觉、语音与文本处理能力&#xff0c;在资源受限设备上实现高效…

三菱Q系plc伺服fb程序 伺服用的FB功能块写法,编程方式非常清晰明了,程序都有注释、注释全...

三菱Q系plc伺服fb程序 伺服用的FB功能块写法&#xff0c;编程方式非常清晰明了&#xff0c;程序都有注释、注释全面&#xff0c;用的三菱Q系列plc&#xff0c;本程序为伺服定位控制程序&#xff0c;可借鉴、可做模板&#xff0c;本程序已经设备实际批量应用、稳定生产、成熟可…

从非结构化文本到关键信息抽取|AI智能实体侦测服务全解析

从非结构化文本到关键信息抽取&#xff5c;AI智能实体侦测服务全解析 在当今信息爆炸的时代&#xff0c;海量的非结构化文本&#xff08;如新闻、社交媒体内容、客服对话等&#xff09;每天都在产生。如何从中快速提取出有价值的关键信息&#xff0c;成为企业提升效率、构建知…

西门子FB284伺服v90profinet程序,自动排列机实战项目详解,4轴控制,全面解析RF...

西门子FB284伺服v90profinet程序西门子触摸屏程序&#xff0c;新能源行业自动排列机&#xff0c;真实项目&#xff0c;V90 走PN 口控制4轴&#xff0c;自己写的RFID读写FB SCL和西门子运动控制FB块开放&#xff0c;直接复制可用&#xff0c;没有密码&#xff0c;详细注释&…

P6KE220A单向 TVS瞬态抑制二极管:峰值脉冲功率600W

P6KE220Atvs瞬态电压抑制二极管原理 P6KE220A单向 TVS瞬态抑制二极管 二极管产品已经跟我们的生活有着密不可分的联系了&#xff0c; TVS瞬态抑制二极管&#xff0c;是一种高效能保护二极管&#xff0c;产品体积小、功率大、响应快等诸多优点&#xff0c;产品应用广泛 TVS瞬态…

移动端多模态AI实践|基于AutoGLM-Phone-9B实现高效本地推理

移动端多模态AI实践&#xff5c;基于AutoGLM-Phone-9B实现高效本地推理 随着大模型技术的快速发展&#xff0c;将多模态能力部署到移动端设备已成为智能应用的重要趋势。然而&#xff0c;受限于移动终端的算力、内存和功耗&#xff0c;如何在资源紧张的环境下实现高质量的本地…

三菱PLC ADPRW通讯FB程序 本程序用的FB功能块写法,编程方式非常清晰明了,程序都有注...

三菱PLC ADPRW通讯FB程序 本程序用的FB功能块写法&#xff0c;编程方式非常清晰明了&#xff0c;程序都有注释、注释全面&#xff0c;用的三菱FX3U系列plc与台达变频器RS485通讯&#xff0c;可借鉴、可做模板&#xff0c;本程序已经设备实际批量应用、稳定生产、成熟可靠&…

STM32 三轴联动 带插补 加减速 源代码 MDK 源码 分别基于STM32F1和STM32...

STM32 三轴联动 带插补 加减速 源代码 MDK 源码 分别基于STM32F1和STM32F4两套的三轴联动插补(直线圆弧两种带)加减速的源码&#xff0c;基于国外写的脱机简易雕刻机源码的项目修改&#xff0c;添加了大量的中文注释&#xff0c;可以很好帮助大家学习这个源码。最近在搞雕刻机运…

移动端多模态大模型实践|基于AutoGLM-Phone-9B高效部署

移动端多模态大模型实践&#xff5c;基于AutoGLM-Phone-9B高效部署 1. 引言&#xff1a;移动端多模态AI的挑战与机遇 随着智能手机算力的持续提升&#xff0c;在终端侧运行大语言模型&#xff08;LLM&#xff09; 已从理论走向现实。然而&#xff0c;将具备视觉、语音、文本融…

基于 Hu 不变距的图像检索应用之旅

20.基于hu不变距的图像检索应用 MATLAB程序 检索相识图片&#xff0c;计算hu特征和颜色特征进行图像检索&#xff0c;带gui界面在图像处理领域&#xff0c;图像检索是一个超有趣且实用的话题。今天咱就来唠唠基于 Hu 不变距结合颜色特征&#xff0c;并带上 GUI 界面的图像检索 …

智能仓储系统在汽车零部件管理中的应用

智能仓储系统在汽车零部件管理中的应用技术架构与应用实践&#xff1a;从物联网到人工智能智能仓储系统的技术架构通常围绕数据采集、处理和执行三个层面展开。在数据采集方面&#xff0c;物联网&#xff08;IoT&#xff09;技术发挥着重要作用。通过RFID标签、条码扫描器和传感…

PDF-Extract-Kit镜像实战|一键提取表格、公式与文本的完整方案

PDF-Extract-Kit镜像实战&#xff5c;一键提取表格、公式与文本的完整方案 1. 引言&#xff1a;PDF智能提取的工程痛点与解决方案 在科研、教育、出版和企业文档处理中&#xff0c;PDF文件承载了大量结构化信息——包括文本、表格和数学公式。然而&#xff0c;传统方法如手动…

Qt5.14多线程C++工业上位机自动称重编程工程

本人开发多线程qt5_c工业上位机自动称重&#xff01; Qt5之工业应用&#xff01; 一套完整工程&#xff0c;工业电子称使用&#xff0c;无线扫码枪的使用&#xff0c;串口的使用&#xff0c;使用qt5.14&#xff0c;用qtcreator加载工程后&#xff0c;编译&#xff0c;运行&…

PDF-Extract-Kit核心功能解析|附布局检测与OCR实践案例

PDF-Extract-Kit核心功能解析&#xff5c;附布局检测与OCR实践案例 1. 工具概述与核心价值 1.1 技术背景与行业痛点 在数字化转型浪潮中&#xff0c;PDF文档作为信息载体被广泛应用于学术论文、技术手册、财务报表等场景。然而&#xff0c;传统PDF处理工具普遍存在三大痛点&…

威纶通与三菱PLC条码枪解码程序分享

威纶通与三菱PLC条码枪解码程序本程序是威纶通触摸屏USB接头直接插条形码扫码枪&#xff0c;得到的数据传送到PLC中进行解码&#xff0c;转化成为PLC能识别的十进制&#xff0c;用于需要使用扫码枪设定数据是非常实用&#xff0c;当然带485通信的扫码枪直接与PLC通信不需要这一…

AutoGLM-Phone-9B核心优势揭秘|轻量级多模态模型落地指南

AutoGLM-Phone-9B核心优势揭秘&#xff5c;轻量级多模态模型落地指南 1. 技术背景与核心价值 随着移动智能设备的普及&#xff0c;用户对本地化、低延迟、高隐私保护的AI服务需求日益增长。然而&#xff0c;传统大语言模型&#xff08;LLM&#xff09;通常参数庞大、计算资源…

BP神经网络数据分类预测与故障信号诊断分类Matlab代码及遗传算法、PNN概率神经网络数据分类实例

BP神经网络的数据分类预测和故障信号诊断分类matlab代码 &#xff0c;直接运行出数据分类结果和误差分布&#xff0c;注释详细易读懂&#xff0c;可直接套数据运行。 PS&#xff1a;基于遗传算法的BP神经网络数据分类预测&#xff0c;基于PNN概率神经网络数据分类matlab等。搞…

MODBUS-RTU协议主机和从机代码STM32 包含2个程序代码,主机和从机(我代码最容易看懂)

MODBUS-RTU协议主机和从机代码STM32 包含2个程序代码&#xff0c;主机和从机&#xff08;我代码最容易看懂&#xff09; 基于温度传感器DS18B20的MODBUS-RTU从机 主机发送指令&#xff1a;01 03 20 00 00 01 8F CA 从机收到指令返回温度数据 06指令修改Add通信地址/站号和波特率…

深入探讨C#三菱FX编程口协议RS422圆口,推荐测试工具及相关资料

C# 三菱FX编程口协议RS422圆口 C#三菱FX编程口协议RS422圆口测试工具&#xff0c;及其相关资料最近在折腾三菱FX系列PLC的通信工具时发现&#xff0c;原厂给的编程口协议文档看得人头皮发麻。特别是RS422圆口的硬件接线&#xff0c;稍不留神就烧串口。今天咱们就用C#手搓个测试…

被局域网卡脖子的 WPS?用cpolar这样设置,在哪都能改文档

✨道路是曲折的&#xff0c;前途是光明的&#xff01; &#x1f4dd; 专注C/C、Linux编程与人工智能领域&#xff0c;分享学习笔记&#xff01; &#x1f31f; 感谢各位小伙伴的长期陪伴与支持&#xff0c;欢迎文末添加好友一起交流&#xff01; 1. 拉取WPS Office镜像2. 运行W…