当前位置: 首页 > news >正文

golang 调用exe 并获取pid

// callSendPublishing 调用SendPublishing程序处理任务(内部方法)
// 返回进程句柄和错误
func callSendPublishing(qName string, headerKey string) (*os.Process, error) {// 先在Redis中创建一个占位符,表示进程即将启动placeholderPID := "starting"// 同步保存占位符到 RedissetProcessIdErr := redis.SetProcessId(redis.GetRedisClient("a"), headerKey, placeholderPID)if setProcessIdErr != nil {return nil, fmt.Errorf("保存进程占位符到Redis失败: %v, 队列: %s", setProcessIdErr, qName)}// 构建 SendPublishing程序路径fileUrlConfig, getFileUrlConfigErr := config.GetFileUrlConfig()if getFileUrlConfigErr != nil {return nil, getFileUrlConfigErr}programPath := fileUrlConfig.BFileName// 修正参数顺序,去掉-NoExit(如果不是PowerShell程序)psScript := fmt.Sprintf(`# 启动程序$psi = New-Object System.Diagnostics.ProcessStartInfo$psi.FileName = "%s"$psi.Arguments = "%s"$psi.UseShellExecute = $true$psi.WindowStyle = 'Normal'$process = [System.Diagnostics.Process]::Start($psi)# 等待窗口句柄可用$timeout = 3000  # 3秒超时$startTime = Get-Datewhile ($process.MainWindowHandle -eq [IntPtr]::Zero -and ((Get-Date) - $startTime).TotalMilliseconds -lt $timeout) {Start-Sleep -Milliseconds 50$process.Refresh()}# 如果获取到窗口句柄,提到前台if ($process.MainWindowHandle -ne [IntPtr]::Zero) {Add-Type @"using System;using System.Runtime.InteropServices;public class WindowHelper {[DllImport("user32.dll")]public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);[DllImport("user32.dll")]public static extern bool SetForegroundWindow(IntPtr hWnd);[DllImport("user32.dll")]public static extern bool AllowSetForegroundWindow(uint dwProcessId);}
"@
            # 允许设置前台窗口[WindowHelper]::AllowSetForegroundWindow($process.Id)[WindowHelper]::ShowWindow($process.MainWindowHandle, 9)  # SW_RESTORE[WindowHelper]::SetForegroundWindow($process.MainWindowHandle)} else {Write-Warning "未能获取到窗口句柄,但进程已启动 (PID: $($process.Id))"}Write-Output $process.Id`, programPath, qName)cmd := exec.Command("powershell", "-Command", psScript)// 关键配置:使程序在独立控制台运行if runtime.GOOS == "windows" {cmd.SysProcAttr = &syscall.SysProcAttr{CreationFlags: 0x00000010, // 创建新控制台
        }}output, err := cmd.Output()if err != nil {return nil, err}// 解析PIDvar pid uint32lines := strings.Split(string(output), "\n")for _, line := range lines {line = strings.TrimSpace(line)if pids, err := strconv.Atoi(line); err == nil {pid = uint32(pids)}}// 获取进程句柄// 立即将真实 PID保存到RedisprocessID := fmt.Sprintf("%d", pid)setProcessIdErr = redis.SetProcessId(redis.GetRedisClient("a"), headerKey, processID)if setProcessIdErr != nil {return nil, fmt.Errorf("更新进程PID到Redis失败: %v, 队列: %s", setProcessIdErr, qName)}// 启动 goroutine等待进程结束并清理 Redisgo func(pid int, qName string, headerKey string) {// 定期检查进程是否还在运行for {time.Sleep(2 * time.Second) // 每2秒检查一次if !isProcessExistWindows(pid) {// 进程已结束,清理Redisif headerKey != "" {deleteProcessIdErr := redis.DeleteProcessId(redis.GetRedisClient("a"), headerKey)if deleteProcessIdErr != nil {logStr := fmt.Sprintf("清理Redis进程记录失败,PID: %d, 队列: %s, 错误: %v", pid, qName, deleteProcessIdErr)logs.LoggingMiddleware(logs.LOG_LEVEL_ERROR, logStr)}break}}}}(int(pid), qName, headerKey)//将生成的process和redisKey 存储到文件 executingfilereturn &os.Process{Pid: int(pid)}, nil
}

 

http://www.jsqmd.com/news/410897/

相关文章:

  • 2026除甲醛产品排名揭晓,初态素等好用之选,哪家性价比高 - 工业推荐榜
  • 计算机毕设Java基于mvc的酒店管理系统 基于SSM框架的酒店客房预订与运营管理系统 Java Web驱动的智能化民宿服务管理平台
  • 2026最新云南旅游机构top9推荐!芒市+瑞丽+腾冲/西双版纳/昆明+大理+丽江+香格里拉+泸沽湖/昆大丽香泸等地优质定制团权威榜单发布 - 十大品牌榜
  • 分析天津比较好的快速离婚律师,助您快速开启新生活 - 工业品网
  • 计算机毕设Java家教信息发布平台 基于SpringBoot的在线家教资源匹配与服务系统 Java Web环境下智能化家教供需对接平台
  • 计算机毕设Java基于Spring的校园兴趣社团系统的设计与实现 高校社团活动管理平台的设计与实现——基于SpringBoot框架 Spring框架下大学生社团信息化管理系统构建研究
  • 盘点靠谱的长沙像素壹佰,聊聊教学环境与规模,怎么收费? - 工业设备
  • 分析好用的博物馆展柜品牌,好贝佳(福州)科技发展有限公司值得信赖 - myqiye
  • 总结2026年靠谱的真空磁流体公司,朗润磁电服务全国 - 工业品牌热点
  • 解读买地板服务推荐,米罗尼打造舒适家居空间 - 工业品网
  • 聊聊靠谱的船用柴油发电机组厂商,哪家性价比高 - mypinpai
  • 聊聊2026年运营简历模板免费下载平台,费用情况如何 - 工业品牌热点
  • 聊聊昆明优选软装研发能力,满意度如何一看便知 - 工业设备
  • 了解冰棍供应商,宝成百利能解决店铺冰品经营问题吗 - 工业推荐榜
  • 教育平台Java如何实现教学视频分片上传的哈希值秒传判断机制?
  • 2026年宁德地区定制酒柜实力厂商推荐,选购攻略请收好 - mypinpai
  • 汽车制造行业Java如何设计分片上传后的视频文件MD5完整性校验方案?
  • 维普降AI工具横评:嘎嘎降AI对比其他主流工具
  • 央企项目Java源码如何封装视频分块上传的客户端加密校验逻辑?
  • 2026年北京好用的智能安全帽企业推荐,实力强、售后完善的品牌有哪些 - 工业品网
  • kotlin 高阶函数用法
  • 2026广东最新天然野生沉香批发top10推荐!广州等地优质沉香生产厂家权威榜单发布,品质纯正选品指南 - 十大品牌榜
  • 盘点江苏公司认证服务,口碑排名靠谱机构大盘点 - mypinpai
  • Excel VBA对象模型
  • 互联网大厂Java求职面试实战:核心技术栈与支付金融服务场景深度解析
  • 学霸同款! 降AIGC软件 千笔·专业降AI率智能体 VS PaperRed,继续教育首选
  • 国产化CKEDITOR编辑器支持PDF文档直接粘贴上传到云存储吗?
  • Nlog 配置文件示例
  • 或许是八字手链人物传记计划外传——胡哥
  • 清单来了:9个AI论文软件深度测评,自考毕业论文写作必备工具推荐