You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决curl: (6) Couldn't resolve host错误?循环API调用异常排查

问题分析与解决方案

这个问题的根源很明确——Shell中的单引号会完全阻止变量展开!你在curl命令里用单引号包裹了包含环境变量的部分,导致Bash没有把$SERVERPROTOCOL、$USERNAME这些变量替换成实际值,curl直接把$SERVERPROTOCOL:当成了主机名的一部分,自然会抛出"无法解析主机"的错误。

修改后的脚本

我把需要展开变量的部分换成了双引号(同时修正了你脚本里USERPASS漏写$的小问题):

for pi in $(cat $halted_pid);do
    # write PID to console so user knows script is working
    echo
    echo "cancelling process instance - $pi"
    # 2>&1 to include any output on stderr
    curl -X DELETE -k -H 'Content-Type: application/xml' -H 'Accept: application/xml' -u "$USERNAME:$USERPASS" -i "$SERVERPROTOCOL://$SERVERHOST:$SERVERPORT/process/cancel/$pi" 2>&1 | tee -a $halted_pi_cancellation_logfile
done

关键修改点说明

  1. 认证部分:把-u '$USERNAME:USERPASS'改成-u "$USERNAME:$USERPASS"
    双引号会让Shell正常展开变量,同时如果密码里包含!、@这类特殊字符,双引号也能正确处理(只要特殊字符不是双引号本身)。
  2. URL部分:把单引号包裹的URL换成"$SERVERPROTOCOL://$SERVERHOST:$SERVERPORT/process/cancel/$pi"
    这样$SERVERPROTOCOL、$SERVERHOST、$SERVERPORT和循环变量$pi都会被替换成实际值,生成正确的请求地址。

额外优化建议

如果你的$halted_pid文件里存在空行或者PID包含空格(虽然可能性低),用$(cat $halted_pid)读取内容可能会出现错误分割的情况,更稳妥的写法是用while read循环:

while read -r pi; do
    # 跳过空行
    [[ -z "$pi" ]] && continue
    echo
    echo "cancelling process instance - $pi"
    curl -X DELETE -k -H 'Content-Type: application/xml' -H 'Accept: application/xml' -u "$USERNAME:$USERPASS" -i "$SERVERPROTOCOL://$SERVERHOST:$SERVERPORT/process/cancel/$pi" 2>&1 | tee -a "$halted_pi_cancellation_logfile"
done < "$halted_pid"

内容的提问来源于stack exchange,提问作者Ranjeet

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 07:47:52