以下是示例代码,展示了如何使用 os/exec 包创建进程并终止进程:

package main

import (
	"fmt"
	"os"
	"os/exec"
	"syscall"
)

func main() {
	// 创建并启动新进程
	cmd := exec.Command("sleep", "5")
	err := cmd.Start()
	if err != nil {
		fmt.Println("Failed to start process:", err)
		return
	}

	fmt.Println("New process started. PID:", cmd.Process.Pid)

	// 等待进程完成
	err = cmd.Wait()
	if err != nil {
		fmt.Println("Process finished with error:", err)
		return
	}

	fmt.Println("Process finished successfully.")

	// 终止进程
	err = terminateProcess(cmd.Process.Pid)
	if err != nil {
		fmt.Println("Failed to terminate process:", err)
		return
	}

	fmt.Println("Process terminated.")
}

// 终止进程
func terminateProcess(pid int) error {
	process, err := os.FindProcess(pid)
	if err != nil {
		return err
	}

	// 使用系统调用发送终止信号
	err = process.Signal(syscall.SIGTERM)
	if err != nil {
		return err
	}

	return nil
}

在这个示例中,我们首先导入了需要使用的包,包括 fmtosos/execsyscall

然后,在 main() 函数中,我们使用 exec.Command() 函数创建一个表示要执行的外部命令的命令对象。这里我们创建的是一个执行 sleep 5 命令的进程。

接下来,我们使用命令对象的 Start() 方法启动新进程。如果启动进程过程中发生错误,我们将错误信息输出并返回。

然后,我们等待进程完成,使用命令对象的 Wait() 方法。这个方法会阻塞当前程序直到进程完成。如果进程在等待期间发生错误,我们将错误信息输出并返回。

完成进程后,我们使用 os.FindProcess() 函数根据进程 ID(PID)获取进程对象。然后,我们使用系统调用 process.Signal() 发送终止信号(SIGTERM)来终止进程。

最后,我们打印出相应的状态信息,以展示进程的启动、完成和终止过程。

要运行这个示例,可以在命令行中使用以下命令:

go run main.go

运行后,会创建一个新的进程执行 sleep 5 命令,等待5秒钟后进程完成。然后,会终止该进程并输出相应的状态信息。

通过使用 os/exec 包,我们可以创建和控制外部进程,并在需要时终止它们。这对于与其他程序进行交互、执行长时间运行的任务或进行进程管理非常有用。