1 分钟阅读 次阅读

在 Linux 脚本和 Android 的 init.rc 文件中,exec 命令的行为和用途有显著差异。

1. 执行上下文与用途

| Linux Shell 脚本中的 exec | Android init.rc 中的 exec -- | |———————————-|————————————-| | 用于 替换当前 Shell 进程 的映像,执行后原脚本进程被完全替换,后续代码不再执行。 | 用于 在 Android 初始化阶段启动子进程(通常是服务或一次性命令),由 init 进程管理,不会替换 init 进程自身。 | | 常见用途:优化脚本资源占用(如 exec java -jar app.jar 避免额外 Shell 进程)。 | 常见用途:在系统启动时初始化服务或执行关键命令(如挂载分区、启动守护进程)。 |


2. 进程管理行为

| Linux Shell 脚本中的 exec | Android init.rc 中的 exec -- | |———————————-|————————————-| | 直接替换当前进程,不创建子进程。执行后原进程 PID 不变,但内容被新命令覆盖。 | init 进程 fork 子进程 并执行命令,原 init 进程继续运行。 | | 示例:exec ls 会终止 Shell,用 ls 进程替代,ls 退出后无后续操作。 | 示例:exec -- /system/bin/foobar 会创建一个独立子进程运行 foobarinit 进程监控其生命周期。 |


3. 参数与选项处理

| Linux Shell 脚本中的 exec | Android init.rc 中的 exec -- | |———————————-|————————————-| | 直接传递参数给新命令,无需特殊分隔符。例如:
exec /bin/prog arg1 arg2。 | 使用 -- 分隔 exec 的选项和实际命令,避免参数解析歧义。例如:
exec -- /system/bin/foobar arg1 arg2。 | | 无额外选项,仅替换进程。 | 支持附加选项(如 -- /path/to/command 中的 -- 是语法强制要求)。 |


4. 权限与上下文

| Linux Shell 脚本中的 exec | Android init.rc 中的 exec -- | |———————————-|————————————-| | 继承当前 Shell 的权限(取决于执行用户)。 | 通常以 root 权限运行(由 init 控制),可指定用户、组或安全上下文(如 seclabel)。 | | 示例:普通用户脚本中的 exec 以该用户权限运行。 | 示例:exec -- u:r:vendor_service:s0 /vendor/bin/service 指定 SELinux 上下文。 |


5. 错误处理与日志

| Linux Shell 脚本中的 exec | Android init.rc 中的 exec -- | |———————————-|————————————-| | 若命令执行失败,脚本进程终止,错误输出到标准错误流(stderr)。 | 错误信息由 init 记录到 Android 日志(可通过 logcat 查看),init 可能尝试重启服务(如果配置了 oneshot 以外的选项)。 | | 示例:exec non_existent_command 会导致脚本立即终止。 | 示例:exec 失败会在日志中标记,但 init 进程继续运行。 |


6. 环境变量与资源限制

| Linux Shell 脚本中的 exec | Android init.rc 中的 exec -- | |———————————-|————————————-| | 继承当前 Shell 的环境变量。 | 通常使用 init 进程的默认环境,可通过 setenvinit.rc 中显式设置。 | | 示例:exec 后的命令可访问 PATH 等 Shell 变量。 | 示例:可能需要通过 export PATH /sbin:/system/bin 设置路径。 |


7. 典型用例对比

  • Linux Shell 脚本中的 exec
    # 脚本结束,由 `nginx` 进程替代当前 Shell
    exec /usr/sbin/nginx -g "daemon off;"
    
  • Android init.rc 中的 exec --
    # 启动一个开机服务,由 init 监控
    service my_service /system/bin/my_service
        class main
        user root
        oneshot
    
    # 直接执行一次性命令
    on boot
        exec -- /system/bin/setup_network
    

总结

  • Linux exec:进程替换工具,用于优化脚本或控制执行流。
  • Android exec --:系统初始化阶段启动子进程的机制,强调进程管理和权限控制。

留下评论