执行命令行代码
- 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 中的调试代码(不会在正常控制台执行时出现)