跳到主要内容

服务器连接

执行命令行代码

  • command 容器中使用 subprocess.Popen 来执行命令行内容
  • 命令行内容除了 ssh 命令,还测试过 xiaomiqiu,napcat,grafana,loki,promtail,windows-exporter,prometheus
  • 一共有 subprocess.check_output(xxx, stderr=subprocess.STDOUT)subprocess.run(xxx,stdout=subprocess.PIPE,stderr=subprocess.PIPE)subprocess.Popen(xxx,stdout=subprocess.PIPE,stderr=subprocess.PIPE)subprocess.Popen(xxx,stdout=subprocess.PIPE,stderr=subprocess.STDOUT) 四种方法
  • 其中只有最后一种将 err 管道重定向到 out 管道的才能兼容所有的命令行日志输出,原因可能为 loki 采用的 go 语言中的日志输出流不太一样,其他方式无法捕获
  • 使用 async for line 代替 while True:line = await process.stdout.readline(),让函数内调用自身(重新执行命令行)也不会阻塞输出
  • 在主程序退出时,主循环退出,各任务结束。在 try-finally 中,只有使用 process.communicate() 才能捕获命令行任务退出时的输出,无论是使用 signal 模拟 Ctrl+C 信号还是使用 process.wait() 都无法捕获
  • 如果采用写入文件的形式会输出不及时,且程序退出时需要额外的等待代码来确保日志文件写完

ssh 命令

ssh_clean

  • 连接服务器
  • 获取占用 10000 的进程
  • 清除该进程
  • 用于中断其他(本用户、其他用户)ssh 连接

ssh_run

  • 连接服务器
  • c 启动压缩
  • v 详细模式
  • n 不执行 ssh 命令
  • D 0.0.0.0:5923 转发 5923(command:5923)
  • R 10000:lrobot:5922 转发端口 lrobot:5922

失败重连

  • 失败重连时若 main 里面重新调用 ssh_run,无法消除环境的影响,故检测到连接失败字段后直接sys.exit(1)退出 + 容器 restart: always 来重新启动

其他命令

  • xiaomiqiu 需要添加 -log stdout 参数,不然默认没有命令行输出只有文件输出
  • 命令行命令中加上 @echo off可以不捕获命令本身,加上 chcp 65001 可以防止一些使用 gbk 编码的文件乱码(统一使用 UTF-8)
  • 此方法可以捕获 Napcat 中的调试代码(不会在正常控制台执行时出现)