The go_pgrep library is a Go package that enables you to conveniently handle Linux process IDs (PIDs) and parent process IDs (PPIDs). Inspired by the Linux command pgrep, this package was developed out of the necessity to find and manage PIDs associated with a given PPID.
Often, when working with processes in Go, we encounter situations where killing a parent process does not terminate its child processes. For instance:
cmd, err := exec.Command("sh", "-c", "watch cat test.txt").Output()
// The command above creates a child process.
cmd.Process.Kill()
// Killing the parent process does not terminate the child process.To handle such cases, go_pgrep provides a set of functions that lets you manage processes more effectively.
go_pgrep provides the following functions for managing processes:
GetPidList: Retrieves all PIDs.GetPidToPPid: Retrieves PIDs associated with a given PPID.GetPidToCmd: Retrieves PIDs associated with a given command.SelfPid: Retrieves the PID of the current process.KillPidToPPid: Terminates processes associated with a given PPID.(process).Kill: Terminates a process.
Here's an example demonstrating how to use go_pgrep:
package main
import (
"fmt"
"github.com/Eric011025/go_pgrep/pgrep"
)
func main() {
// Get PID by PPID
ppidList, err := pgrep.GetPidToPPid(1)
if err != nil {
panic(err)
}
for _, ppidListItem := range ppidList {
fmt.Println("PID: ", ppidListItem.Pid)
}
// Kill PID by PPID
err = pgrep.KillPidToPPid(6684)
if err != nil {
panic(err)
}
// Get PID by command
result, err := pgrep.GetPidToCmd("watch")
if err != nil {
panic(err)
}
for _, value := range result {
fmt.Println("PID: ", value.Pid)
// Kill the process
value.Kill()
}
// Get the current process's PID
selfPid, err := pgrep.SelfPid()
if err != nil {
panic(err)
}
fmt.Println("Self PID: ", selfPid.Pid)
}For any queries or suggestions, feel free to reach out to Eric Park at [email protected].