最近在写一个应用,下面是用到的代码,网上也有挺多的网友遇到这种问题,下面是我的解决方法,分享一下.

使用方法,想exec.Command的时候使用SetPgid设置进程组,杀的时候使用KillAll杀死全部调用产生的进程

代码实现:

Linux处理方法:


package systemimport ("syscall")func SetPgid(pid, pgid int) error {return syscall.Setpgid(pid, pgid)}func GetPPids(pid int) ([]int, error) {return []int{}, nil}func Kill(pids []uint32) {for _, pid := range pids {syscall.Kill(int(pid), syscall.SIGKILL)}}func KillAll(pid int) error {return syscall.Kill(pid-(pid*2), syscall.SIGKILL)}

Windows处理方法:


package systemimport ("os""syscall""unsafe")const (MAX_PATH           = 260TH32CS_SNAPPROCESS = 0x00000002)type ProcessInfo struct {Name stringPid  uint32PPid uint32}type PROCESSENTRY32 struct {DwSize              uint32CntUsage            uint32Th32ProcessID       uint32Th32DefaultHeapID   uintptrTh32ModuleID        uint32CntThreads          uint32Th32ParentProcessID uint32PcPriClassBase      int32DwFlags             uint32SzExeFile           [MAX_PATH]uint16}type HANDLE uintptrvar (modkernel32                  = syscall.NewLazyDLL("kernel32.dll")procCreateToolhelp32Snapshot = modkernel32.NewProc("CreateToolhelp32Snapshot")procProcess32First           = modkernel32.NewProc("Process32FirstW")procProcess32Next            = modkernel32.NewProc("Process32NextW")procCloseHandle              = modkernel32.NewProc("CloseHandle"))func SetPgid(pid, pgid int) error {return nil}func KillAll(pid int) error {pids := Getppids(uint32(pid))Kill(pids)return nil}func Kill(pids []uint32) {for _, pid := range pids {pro, err := os.FindProcess(int(pid))if err != nil {continue}pro.Kill()}}func Getppids(pid uint32) []uint32 {infos, err := GetProcs()if err != nil {return []uint32{pid}}var pids []uint32 = make([]uint32, 0, len(infos))var index int = 0pids = append(pids, pid)var length int = len(pids)for index < length {for _, info := range infos {if info.PPid == pids[index] {pids = append(pids, info.Pid)}}index += 1length = len(pids)}return pids}func GetProcs() (procs []ProcessInfo, err error) {snap := createToolhelp32Snapshot(TH32CS_SNAPPROCESS, uint32(0))if snap == 0 {err = syscall.GetLastError()return}defer closeHandle(snap)var pe32 PROCESSENTRY32pe32.DwSize = uint32(unsafe.Sizeof(pe32))if process32First(snap, &pe32) == false {err = syscall.GetLastError()return}procs = append(procs, ProcessInfo{syscall.UTF16ToString(pe32.SzExeFile[:260]), pe32.Th32ProcessID, pe32.Th32ParentProcessID})for process32Next(snap, &pe32) {procs = append(procs, ProcessInfo{syscall.UTF16ToString(pe32.SzExeFile[:260]), pe32.Th32ProcessID, pe32.Th32ParentProcessID})}return}func createToolhelp32Snapshot(flags, processId uint32) HANDLE {ret, _, _ := procCreateToolhelp32Snapshot.Call(uintptr(flags),uintptr(processId))if ret <= 0 {return HANDLE(0)}return HANDLE(ret)}func process32First(snapshot HANDLE, pe *PROCESSENTRY32) bool {ret, _, _ := procProcess32First.Call(uintptr(snapshot),uintptr(unsafe.Pointer(pe)))return ret != 0}func process32Next(snapshot HANDLE, pe *PROCESSENTRY32) bool {ret, _, _ := procProcess32Next.Call(uintptr(snapshot),uintptr(unsafe.Pointer(pe)))return ret != 0}func closeHandle(object HANDLE) bool {ret, _, _ := procCloseHandle.Call(uintptr(object))return ret != 0}

golang使用execCommand调用的时候子进程如何杀掉处理方法相关推荐

  1. python父进程调用子进程_Python2.7下,调用subprocess启动子进程,读取子进程标准输出若干问题...

    1:如果调用的子进程也是一个python脚本,则subprocess.Popen中的bufsize=1无效果.也就是说,即使设置了bufsize=1表示进行行缓冲,子进程如果不显示调用sys.stdo ...

  2. Golang通过syscall调用windows dll方法

    为什么80%的码农都做不了架构师?>>>    本用例在GO 1.4.2 上编译执行通过,直接上CODE: package main import ("fmt"& ...

  3. Shell 脚本调用另一个脚本的三种方法

    文章目录 1.source 2.点号. 3.sh 命令 4.三者的区别 5.export 命令设置临时环境变量 6.export 命令设置永久环境变量 参考文献 假如有脚本 first.sh: #!/ ...

  4. PhpCms V9调用指定栏目子栏目文章的方法

    PhpCms V9调用指定栏目子栏目文章的方法 第一种,直接写父类id {pc:content action="lists" catid="父类id" num= ...

  5. python子进程通信_python执行子进程实现进程间通信的方法

    本文实例讲述了python执行子进程实现进程间通信的方法.分享给大家供大家参考.具体实现方法如下: a.py: import subprocess, time subproc = subprocess ...

  6. eclipse中用maven多模块管理,然后主项目无法调用其他被依赖项目里的方法,解决办法

    eclipse中用maven多模块管理,然后主项目无法调用其他被依赖项目里的方法,解决办法 参考文章: (1)eclipse中用maven多模块管理,然后主项目无法调用其他被依赖项目里的方法,解决办法 ...

  7. shell实例第19讲:一个脚本中调用另一个脚本的3种方法

    在Shell脚本中调用另一个脚本(3种方法) 准备:主脚本是second.sh,主脚本中调用first.sh 方法1:exec(1)执行方式:exec /home/weibo/shell_test/s ...

  8. dedecms调用自定义会员模型会员信息的方法

    小编给大家分享一下dedecms调用自定义会员模型会员信息的方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!  dede ...

  9. php新浪api,php调用新浪短链接API的方法,php调用新浪api_PHP教程

    php调用新浪短链接API的方法,php调用新浪api 本文实例讲述了php调用新浪短链接API的方法.分享给大家供大家参考.具体方法如下: 复制代码 代码如下: //Sina App_Key def ...

最新文章

  1. WinAPI: PtInRect - 判断点是否在矩形中
  2. Odd Grasshopper 奇偶找规律
  3. python列表的嵌套_Python中关于列表嵌套列表的处理
  4. mysql索引红黑联盟_MySQL索引
  5. 亿方云CEO程远:转型第一式:链接企业人与数据
  6. CF1253E Antenna Coverage
  7. case函数,replace函数
  8. [PAL规范]SAP HANA PAL演绎推理算法Apriori编程规范APRIORIRULE
  9. MySQL安装时Download界面为空,不显示需要下载的组件,MySQL Installer 8.0.28.0 Download界面为空解决方案
  10. java多线程学习系列
  11. 让人耗尽脑汁的需求分析工作(转--Fireball)
  12. 任正非谈鸿蒙系统研究,任正非谈鸿蒙系统 有优势 有信心打造生态
  13. Win7系统文件缺失怎么修复
  14. 大二暑假立秋学习总结
  15. linux 火狐 jre插件,[原]再谈Firefox安装java插件的问题
  16. Chromium内核和Webkit的关系到底是什么?
  17. AT指令发送短信流程及接听、拨打电话
  18. html的国际标准智商测试,国际标准智商测试30题(含答案)
  19. 软件测试周刊(第17期):分歧比共识重要,为啥?
  20. C语言——对文件的输入输出

热门文章

  1. android webview onkeydown,android – WebView片段内的OnKeyDown
  2. 完美实现如何在安卓设备设置公司outlook等邮箱
  3. java接口的初始化
  4. 《HelloGitHub》第 88 期
  5. Java split()方法中的特殊符号
  6. 同域相对论|孔祥勇:Doctor. AI
  7. @Transactional 注解
  8. Ubuntu安装NVIDIA英伟达显卡驱动教程
  9. MiniUI关闭当前Tab页面并回到指定Tab
  10. 80老翁谈人生(269):什么叫EmDrive引擎?