golang使用execCommand调用的时候子进程如何杀掉处理方法
最近在写一个应用,下面是用到的代码,网上也有挺多的网友遇到这种问题,下面是我的解决方法,分享一下.
使用方法,想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调用的时候子进程如何杀掉处理方法相关推荐
- python父进程调用子进程_Python2.7下,调用subprocess启动子进程,读取子进程标准输出若干问题...
1:如果调用的子进程也是一个python脚本,则subprocess.Popen中的bufsize=1无效果.也就是说,即使设置了bufsize=1表示进行行缓冲,子进程如果不显示调用sys.stdo ...
- Golang通过syscall调用windows dll方法
为什么80%的码农都做不了架构师?>>> 本用例在GO 1.4.2 上编译执行通过,直接上CODE: package main import ("fmt"& ...
- Shell 脚本调用另一个脚本的三种方法
文章目录 1.source 2.点号. 3.sh 命令 4.三者的区别 5.export 命令设置临时环境变量 6.export 命令设置永久环境变量 参考文献 假如有脚本 first.sh: #!/ ...
- PhpCms V9调用指定栏目子栏目文章的方法
PhpCms V9调用指定栏目子栏目文章的方法 第一种,直接写父类id {pc:content action="lists" catid="父类id" num= ...
- python子进程通信_python执行子进程实现进程间通信的方法
本文实例讲述了python执行子进程实现进程间通信的方法.分享给大家供大家参考.具体实现方法如下: a.py: import subprocess, time subproc = subprocess ...
- eclipse中用maven多模块管理,然后主项目无法调用其他被依赖项目里的方法,解决办法
eclipse中用maven多模块管理,然后主项目无法调用其他被依赖项目里的方法,解决办法 参考文章: (1)eclipse中用maven多模块管理,然后主项目无法调用其他被依赖项目里的方法,解决办法 ...
- shell实例第19讲:一个脚本中调用另一个脚本的3种方法
在Shell脚本中调用另一个脚本(3种方法) 准备:主脚本是second.sh,主脚本中调用first.sh 方法1:exec(1)执行方式:exec /home/weibo/shell_test/s ...
- dedecms调用自定义会员模型会员信息的方法
小编给大家分享一下dedecms调用自定义会员模型会员信息的方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! dede ...
- php新浪api,php调用新浪短链接API的方法,php调用新浪api_PHP教程
php调用新浪短链接API的方法,php调用新浪api 本文实例讲述了php调用新浪短链接API的方法.分享给大家供大家参考.具体方法如下: 复制代码 代码如下: //Sina App_Key def ...
最新文章
- WinAPI: PtInRect - 判断点是否在矩形中
- Odd Grasshopper 奇偶找规律
- python列表的嵌套_Python中关于列表嵌套列表的处理
- mysql索引红黑联盟_MySQL索引
- 亿方云CEO程远:转型第一式:链接企业人与数据
- CF1253E Antenna Coverage
- case函数,replace函数
- [PAL规范]SAP HANA PAL演绎推理算法Apriori编程规范APRIORIRULE
- MySQL安装时Download界面为空,不显示需要下载的组件,MySQL Installer 8.0.28.0 Download界面为空解决方案
- java多线程学习系列
- 让人耗尽脑汁的需求分析工作(转--Fireball)
- 任正非谈鸿蒙系统研究,任正非谈鸿蒙系统 有优势 有信心打造生态
- Win7系统文件缺失怎么修复
- 大二暑假立秋学习总结
- linux 火狐 jre插件,[原]再谈Firefox安装java插件的问题
- Chromium内核和Webkit的关系到底是什么?
- AT指令发送短信流程及接听、拨打电话
- html的国际标准智商测试,国际标准智商测试30题(含答案)
- 软件测试周刊(第17期):分歧比共识重要,为啥?
- C语言——对文件的输入输出