Openwrt /lib/functions/procd.sh脚本

本文详细介绍了Openwrt系统中/lib/functions/procd.sh脚本的作用,该脚本在/sbin/procd启动后负责监听hotplug事件,并根据hotplug.json执行相应的/etc/hotplug.d/目录下的脚本。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Openwrt /lib/functions/procd.sh脚本是在/sbin/procd进程启动后,将会对hotplug实现进行监听,当有hotplug的event时,将会使用hotplug.json,执行/etc/hotplug.d/下与event对应的脚本文件

[root@PandoraBox:/lib/functions]#cat /lib/functions/procd.sh 
# procd API:
#
# procd_open_service(name, [script]):
#   Initialize a new procd command message containing a service with one or more instances
#
# procd_close_service()
#   Send the command message for the service
#
# procd_open_instance([name]):
#   Add an instance to the service described by the previous procd_open_service call
#
# procd_set_param(type, [value...])
#   Available types:
#     command: command line (array).
#     respawn info: array with 3 values $restart_timeout $fail_hreshold $max_fail
#     env: environment variable (passed to the process)
#     data: arbitrary name/value pairs for detecting config changes (table)
#     file: configuration files (array)
#     netdev: bound network device (detects ifindex changes)
#     limits: resource limits (passed to the process)
#     user info: array with 1 values $username
#
#   No space separation is done for arrays/tables - use one function argument per command line argument
#
# procd_close_instance():
#   Complete the instance being prepared
#
# procd_kill(service, [instance]):
#   Kill a service instance (or all instances)
#

. $IPKG_INSTROOT/usr/share/libubox/jshn.sh

_PROCD_SERVICE=

_procd_call() {
        local old_cb

        json_set_namespace procd old_cb
        "$@"
        json_set_namespace $old_cb
}

_procd_wrapper() {
        while [ -n "$1" ]; do
                eval "$1() { _procd_call _$1 \"\$@\"; }"
                shift
        done
}

_procd_ubus_call() {
        local cmd="$1"

        [ -n "$PROCD_DEBUG" ] && json_dump >&2
        ubus call service "$cmd" "$(json_dump)"
        json_cleanup
}

_procd_open_service() {
        local name="$1"
        local script="$2"

        _PROCD_SERVICE="$name"
        _PROCD_INSTANCE_SEQ=0

        json_init
        json_add_string name "$name"
        [ -n "$script" ] && json_add_string script "$script"
        json_add_object instances
}

_procd_close_service() {
        json_close_object
        service_triggers
        _procd_ubus_call set
}

_procd_add_array_data() {
        while [ "$
<think>好的,我现在需要帮用户解决他们在使用acme.sh时遇到的问题。根据用户提供的日志,他们在执行acme.sh时遇到了“not found”的错误,然后通过find命令发现acme.sh实际安装在两个路径:/root/.acme.sh/acme.sh和/usr/lib/acme/client/acme.sh。用户之前可能按照某些教程安装,但路径可能没有正确配置,导致无法直接运行。 首先,我需要确认用户对acme.sh的基本了解情况。他们可能是在尝试为域名申请SSL证书,尤其是通配符证书,所以需要DNS验证。之前的回答已经给出了一些解决方案,但现在用户发现了不同的安装路径,可能需要调整之前的建议。 用户当前的路径显示acme.sh存在于两个位置,这可能是因为安装方式不同或者有多个安装实例。常见的情况是,用户可能通过不同的包管理器或手动安装,导致路径混乱。需要确定哪个路径是正确的,或者是否需要调整环境变量。 接下来,我应该检查为什么直接运行acme.sh会报错。通常是因为该脚本不在PATH环境变量中。用户可能需要使用绝对路径来执行,或者将安装目录添加到PATH中。另外,需要检查脚本是否有可执行权限,如果没有,需要chmod +x。 另外,用户可能在使用OpenWrt系统,而acme.sh的标准安装路径可能是/usr/lib/acme/client/acme.sh,这可能是通过opkg安装的。而/root/.acme.sh/acme.sh可能是用户手动安装的,导致冲突。需要建议用户确认安装方式,并选择正确的路径。 还需要考虑用户是否安装了必要的依赖,比如acme-dnsapi,特别是当他们使用DNS验证(如DNSPod)时。如果依赖未安装,即使路径正确,也可能无法成功申请证书。 用户可能需要指导如何正确设置环境变量,或者创建符号链接,使得可以直接在命令行中运行acme.sh。同时,提醒用户注意权限问题,尤其是证书文件的保存路径,可能需要root权限或正确的目录权限。 最后,用户可能需要调试步骤,例如使用--debug参数查看详细日志,或者检查DNS记录是否正确传播,这些都是在申请证书过程中常见的问题点。需要确保用户了解每个步骤的作用,避免遗漏关键配置。</think>根据你的路径查找结果,系统存在两个acme.sh实例,以下是关键分析及解决方案: ```bash # 路径对比分析 1. 用户目录安装版:/root/.acme.sh/acme.sh → 可能通过curl安装 2. 系统标准安装版:/usr/lib/acme/client/acme.sh → 通过opkg安装 # 推荐解决方案: # ▶方案一:使用opkg安装的版本(推荐) # 步骤1:创建符号链接 ln -s /usr/lib/acme/client/acme.sh /usr/bin/acme.sh # 步骤2:验证调用 acme.sh --version # 应显示OpenWrt打包版本 # ▶方案二:使用用户目录版本(需要手动维护) # 步骤1:添加环境变量 echo 'export PATH="$PATH:/root/.acme.sh"' >> ~/.bashrc source ~/.bashrc # 步骤2:别名简化(避免冲突) echo 'alias myacme="/root/.acme.sh/acme.sh"' >> ~/.bashrc # 版本差异说明: | 特性 | 系统版(/usr/lib) | 用户版(/root/.acme.sh) | |--------------|-----------------------|-----------------------| | 更新方式 | opkg update升级 | 需手动执行acme.sh --upgrade | | 配置文件路径 | /etc/acme | ~/.acme.sh | | 依赖管理 | 自动处理 | 需手动安装curl/socat | # 通用修复流程: # 1. 删除冲突版本(二选一) opkg remove acme # 移除系统版 rm -rf ~/.acme.sh # 移除用户版 # 2. 全新安装(推荐系统版) opkg update opkg install acme acme-dnsapi # 3. 验证安装 which acme.sh # 应显示/usr/lib/acme/client/acme.sh # 证书存储规范: # 建议使用OpenWrt标准路径: --certpath /etc/ssl/certs --keypath /etc/ssl/private --capath /etc/ssl/certs # 自动化配置技巧: # 创建证书续期任务(crontab示例) 0 0 * * * /usr/lib/acme/client/acme.sh --cron \ --home /etc/acme \ --certpath /etc/ssl/certs \ --keypath /etc/ssl/private ``` **关键故障排查点**: 1. 若出现`Cannot create directory`错误 → 执行 `mkdir -p /etc/acme` 2. 若报`No such service` → 确保已安装`acme-dnsapi`并重启服务 `/etc/init.d/acme restart` 3. 通配符证书需确认DNS API的_TXT记录传播完成(等待2-5分钟)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值