为什么shell脚本中执行命令要加exec

作者: ytcoode分类: 计算机技术 发布时间: 2023-08-12 10:27:42 浏览:13351 次

为什么shell脚本中执行命令要加exec

托莱奇:
其实光看exec关键字会觉得很模糊,但是如果结合它底层的C接口execv/execl的文档看的话就会很明白了,execv的作用就是在保留进程ID的情况下执行下一个进程,而在大部分shell的处理中,不加exec的执行就是新建一个进程(可能是posix_spawn,但大部分会选择fork+exec),有时sh主进程可能会先结束(加&)或者子进程出错后没有错误处理就执行了下一步,所以exec的使用还是挺取决于场景的

【回复】回复 @烛阴的北极光 :容器内启动的第一个进程(在启用了pid namespace的前提下,但基本所有容器都启用)的pid是1,包括系统启动的第一个进程pid也是1
【回复】回复 @阿斯蒂芬自行车v :不过这些都是在编程中的使用了,在shell中我个人用的最多的就是在容器里bash运行systemd(systemd要1号pid)
【回复】exec的作用是把当前的进程刷成新进程,但其余的东西都是保留着的(如果有我不知道的请告诉我,我也研究不深),这样就能有很多有用的用途,比如最基础的输入输出重定向,以及ptrace(gdb用的东西),seccomp,chroot,namespace这些东西都是可以继承的,,所以这东西在编程中还是很重要的
马鸣风萧萧落叶:
fork复制父shell环境,指令执行完成后结束子shell返回父shell;exec开启新shell替代当前shell,exec后的一条命令执行完成后直接退出(exec接重定向除外);source将命令加载到当前shell环境中执行(多用于加载配置文件)

【回复】exec也是要fork的,但我感觉区别就是父进程无需等到子进程退出就可以退出
_筱墨羽:
学过csapp或者Linux环境搞基变成的应该都会了解过,正常sh执行一个程序首先是进行fork一个子进程然后再用exec替换进程的内存,而这边直接执行exec相当于不做fork操作,直接将当前程序直接替换程序的内存

信克总得jk:
请问一下up 关于exec的应用场景,[笑哭]能力经验有限,不知道在shell脚本中使用exec有什么优点好处[tv_鬼脸]

【回复】有很多,比如你最终目的是开启一个服务器,shell 脚本用来准备各种运行环境,最终exec 执行服务器程序,这样就少了一个shell 程序在运行
【回复】比如我需要在一个docker容器中运行我的APP,假如我的启动脚本没有用exec启动APP,那么即使docker会发送终止信号到内部,但由于接收到信号的是不会进行转发的sh/bash,很可能会导致你的应用异常终端,而来不及回收一些资源。
【回复】回复 @smant :这个例子解释更为具体
Nagle-木木:
从结构的角度来看, fork其实就是进程这个数据结构被复制了一份, 填入了新的内容, 并在同层级保留原有内容. 属于是猴哥分身. 而 exec 是直接用了原有的进程数据结构. 相当于鬼怪附身. up 讲了我前段时间也想分享的内容, 不过比我想讲的细多了. 棒!

lzoxun:
这个exec 是 find 找到文件进行操作那个 exec 吗?

【回复】不是的,find 的exec 是只是执行一个命令

脚本 Linux shell

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!