BASH脚本调用wscat输出无法导出到文件 Java调用无日志问题咨询
问题排查与解决方案
现有脚本核心问题
- 输出取值逻辑错误:原脚本中
final=$(eval echo "$master")实际是获取wscat命令的文本内容,而非wscat运行后接收的WebSocket返回结果 - 相对路径异常:Java调用脚本时的工作目录与手动执行时不一致,
logfile.log会生成在Java进程的工作目录下,并非你预期的路径,因此会出现“未生成日志”的假象 - 进程控制逻辑错误:原脚本先sleep 15再启动wscat,启动后直接杀进程,没有预留接收WebSocket返回内容的时间,手动执行能成功属于偶发情况
修正后脚本
#!/bin/bash # 配置日志绝对路径,避免工作目录不一致问题,可自行修改为实际存储目录 LOG_FILE="/usr/local/ws_script/logfile.log" # 自动创建日志目录 mkdir -p $(dirname "${LOG_FILE}") accesskey="" clientnodeid="" while getopts a:c: flag do case "${flag}" in a) accesskey=${OPTARG};; c) clientnodeid=${OPTARG};; esac done # 用timeout控制wscat最长运行15秒,-Q 1表示无新数据1秒后自动退出,直接将输出写入日志 timeout 15 wscat -c ws://localhost:8091/ws/callback \ -H "accessKey:${accesskey}" \ -H "clientNodeId:${clientnodeid}" \ -Q 1 > "${LOG_FILE}" 2>&1 # 直接读取日志内容作为请求参数,使用--data-binary避免特殊字符转义问题 curl -X POST --data-binary "@${LOG_FILE}" \ -k "https://localhost:7460/activate" \ -H "accept: application/json" \ -H "accessKey:${accesskey}" \ -H "clientNodeId:${clientnodeid}" \ -H "Content-Type: application/json" \ -H "callbackRequested:true" exit 0
额外配置说明
- 给脚本添加执行权限:
chmod +x <你的脚本文件名>.sh - 确保脚本中配置的日志目录,Java进程的运行用户拥有读写权限
- 若你使用的wscat版本不支持
-Q参数,可直接删除-Q 1配置,timeout会在15秒后自动终止wscat进程,不会出现资源残留
内容的提问来源于stack exchange,提问作者Vancho
相关产品推荐
相关产品推荐

