golang使用os/exec庫(kù)查詢進(jìn)程方式
更新時(shí)間:2026年04月27日 09:09:25 作者:alden_ygq
本文介紹了使用Go語(yǔ)言os/exec查詢進(jìn)程的方法,并提供了兩種方式,第一種方式輸出了當(dāng)前系統(tǒng)所有運(yùn)行的進(jìn)程,第二種方式可以過(guò)濾出指定進(jìn)程的信息
golang使用os/exec庫(kù)查詢進(jìn)程
本文主要介紹如何使用os/exec庫(kù)查詢進(jìn)程。
package main
import (
"fmt"
"os/exec"
)
func main() {
cmd := exec.Command("ps", "-ef")
output, err := cmd.Output()
if err != nil {
fmt.Println(err)
return
}
fmt.Println(string(output))
}輸出:
go run process.go
UID PID PPID C STIME TTY TIME CMD
0 1 0 0 1 170 ?? 114:31.61 /sbin/launchd
0 287 1 0 1 476 ?? 21:22.98 /usr/libexec/logd
0 288 1 0 1 476 ?? 1:09.95 /usr/libexec/UserEventAgent (System)
0 290 1 0 1 476 ?? 0:23.88 /System/Library/PrivateFrameworks/Uninstall.framework/Resources/uninstalld
0 291 1 0 1 476 ?? 24:42.10 /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/FSEvents.framework/Versions/A/Support/fseventsd
0 292 1 0 1 476 ?? 28:48.91 /Library/Application Support/Symantec/Silo/MES/Daemon/SymDaemon
0 296 1 0 1 476 ?? 1:01.12 /Library/PrivilegedHelperTools/AliCloudPrinterUpdater
0 298 1 0 1 476 ?? 57:11.04 /usr/sbin/systemstats --daemon
0 300 1 0 1 476 ?? 13:41.30 /usr/libexec/configd
0 301 1 0 1 476 ?? 14:46.12 /Library/Application Support/AntGroup/starpoint/Mobius
0 303 1 0 1 476 ?? 6:36.35 /System/Library/CoreServices/powerd.bundle/powerd
501 304 1 0 1 476 ?? 0:08.48 /Library/McAfee/agent/bin/macmnsvc self_start
0 305 1 0 1 476 ?? 1:48.76 /Library/McAfee/agent/bin/masvc self_start
0 306 1 0 1 476 ?? 0:00.01 /usr/libexec/IOMFB_bics_daemon
0 309 1 0 1 476 ?? 0:00.59 /usr/libexec/remoted
0 317 1 0 1 476 ?? 0:30.29 /usr/libexec/watchdogd
0 321 1 0 1 476 ?? 25:27.64 /System/Library/Frameworks/CoreServices.framework/Frameworks/Metadata.framework/Support/mds
0 323 1 0 1 476 ?? 0:01.38 /usr/libexec/kernelmanagerd
0 324 1 0 1 476 ?? 0:43.61 /usr/libexec/diskarbitrationd
0 330 1 0 1 476 ?? 0:31.26 /usr/sbin/syslogd
0 333 1 0 1 476 ?? 1:51.28 /usr/libexec/thermalmonitord
0 334 1 0 1 476 ?? 27:10.87 /usr/libexec/opendirectoryd
0 335 1 0 1 476 ?? 1:15.07 /System/Library/PrivateFrameworks/ApplePushService.framework/apsd
0 337 1 0 1 476 ?? 0:01.15 /Library/PrivilegedHelperTools/com.docker.vmnetd
0 338 1 0 1 476 ?? 9:32.88 /System/Library/CoreServices/launchservicesd
213 341 1 0 1 476 ?? 0:01.83 /System/Library/PrivateFrameworks/MobileDevice.framework/Versions/A/Resources/usbmuxd -launchd
0 342 1 0 1 476 ?? 1:12.54 /usr/sbin/securityd -i
0 343 1 0 1 476 ?? 0:00.03 auditd -l上述代碼邏輯會(huì)獲取到當(dāng)前系統(tǒng)中所有運(yùn)行的進(jìn)程,但如果只需要獲取制定進(jìn)程信息呢,就需要針對(duì)進(jìn)程進(jìn)行過(guò)濾。
第一種方式
package main
import (
"fmt"
"bytes"
"os/exec"
)
func RunCmd(cmdstring string) (string, error) {
var out bytes.Buffer
var stderr bytes.Buffer
cmd := exec.Command("/bin/sh", "-c", cmdstring)
cmd.Stdout = &out
cmd.Stderr = &stderr
err := cmd.Run()
if err != nil {
fmt.Printf("err:%v\n",err)
return fmt.Sprintf("%s",stderr.String()),err
}
return fmt.Sprintf("%v",out.String()),nil
}
func main() {
cmd := fmt.Sprintf("ps -ef | grep '%v'| grep -v grep","/bin/zsh --login -i")
result,err := RunCmd(cmd)
if err != nil {
fmt.Printf("run cmd:%v failed:%v\n",cmd,err)
return
}
fmt.Println(result)
}輸出:
$ go run process.go 502 45987 45915 0 8 623 ttys004 0:00.09 /bin/zsh --login -i 502 76923 45915 0 13 623 ttys009 0:00.07 /bin/zsh --login -i 502 39231 45915 0 三02下午 ttys012 0:00.08 /bin/zsh --login -i
第二種方式
package main
import (
"fmt"
"strings"
"bytes"
"os/exec"
)
func RunCmd(cmdstring string) (string, error) {
var out bytes.Buffer
var stderr bytes.Buffer
cmd := exec.Command("/bin/sh", "-c", cmdstring)
cmd.Stdout = &out
cmd.Stderr = &stderr
err := cmd.Run()
if err != nil {
fmt.Printf("err:%v\n",err)
return fmt.Sprintf("%s",stderr.String()),err
}
return fmt.Sprintf("%v",out.String()),nil
}
func main() {
//cmd := fmt.Sprintf("ps -ef | grep '%v'| grep -v grep","/bin/zsh --login -i")
cmd := fmt.Sprintf("ps -ef")
result,err := RunCmd(cmd)
if err != nil {
fmt.Printf("run cmd:%v failed:%v\n",cmd,err)
return
}
lines := strings.Split(result, "\n")
for _, line := range lines {
if strings.Contains(line, "/bin/zsh --login -i") {
fmt.Println(line)
}
}
}輸出:
$ go run process.go 502 45987 45915 0 8 623 ttys004 0:00.09 /bin/zsh --login -i 502 76923 45915 0 13 623 ttys009 0:00.07 /bin/zsh --login -i 502 39231 45915 0 三02下午 ttys012 0:00.08 /bin/zsh --login -i
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
您可能感興趣的文章:
- Golang標(biāo)準(zhǔn)庫(kù)os/exec執(zhí)行外部命令并獲取其輸出包代碼示例
- Golang查詢MongoDB的實(shí)現(xiàn)步驟
- Golang使用DuckDB查詢Parquet文件數(shù)據(jù)的操作代碼
- Golang Gorm實(shí)現(xiàn)自定義多態(tài)模型關(guān)聯(lián)查詢
- Golang結(jié)合ip2region實(shí)現(xiàn)ip歸屬地查詢
- golang進(jìn)程啟動(dòng)及監(jiān)控方式
- GOLang判斷進(jìn)程是否存在實(shí)現(xiàn)方式
- golang 設(shè)置進(jìn)程退出時(shí)kill所有子進(jìn)程的三種方法
相關(guān)文章
Go語(yǔ)言雙向鏈表list.List的實(shí)現(xiàn)示例
Go語(yǔ)言中的list.List是包提供的雙向鏈表實(shí)現(xiàn),具有高效的插入和刪除操作能力,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-09-09
使用golang-unsafe包的注意事項(xiàng)及說(shuō)明
這篇文章主要介紹了使用golang-unsafe包的注意事項(xiàng)及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02

