Jos*_*ine 13 bash shell-script shell-builtin exec
从 Bash 的内置 exec 文档中考虑这一点:
exec 替换 shell 而不创建新进程
请提供一个用例/实际示例。我不明白这是怎么回事。
我用谷歌搜索并找到了I/O redirection。你能解释得更好吗?
Cel*_*ada 20
exec常用于 shell 脚本,这些脚本主要充当启动其他二进制文件的包装器。例如:
#!/bin/sh
if stuff;
EXTRA_OPTIONS="-x -y -z"
else
EXTRA_OPTIONS="-a foo"
fi
exec /usr/local/bin/the.real.binary $EXTRA_OPTIONS "$@"
Run Code Online (Sandbox Code Playgroud)
以便在包装器完成运行后,“真正的”二进制文件接管并且不再有包装器脚本的任何痕迹暂时占用进程表中的同一插槽。“真正的”二进制文件是任何启动它的直接子文件,而不是孙子文件。
您在问题中还提到了 I/O 重定向。这是一个完全不同的用例,exec与用另一个进程替换 shell 无关。Whenexec没有参数,像这样:
exec 3>>/tmp/logfile
Run Code Online (Sandbox Code Playgroud)
然后命令行上的 I/O 重定向在当前 shell 进程中生效,但当前 shell 进程继续运行并移动到脚本中的下一个命令。
我使用exec内置的 shell 来获取 Java 程序的进程 ID (PID)。现在可能有一种方法可以从 Java 内部获取 PID,但几年前还没有。一旦进程拥有自己的 PID,它就可以将其写出到 PID 文件(查找/var/run/带有“.pid”后缀的文件名)以允许管理程序知道正在运行的进程的 PID,并防止第二个实例从运行的同一台服务器。它的工作原理是这样的:
exec java -cp=YourServer.jar StartClass -p $$
Run Code Online (Sandbox Code Playgroud)
main()类的方法中的代码StartClass处理参数解析并可以找到自己的进程ID。