attachments-2021-10-avG0TjxO617c9bc062b15.jpg

golang如何执行脚本?在golang标准库中提供了两种方式可以用来启动进程调用脚本

第一种是在os库中的Process类型,Process类型包含一系列方法用来启动进程并对进程进行操作(参考: https://golang.org/pkg/os/#Process)

第二种是在os/exec库种通过Cmd类型的各个函数实现对脚本的调用,实际上Cmd是对Process中各种方法的高层次封装(参考: https://golang.org/pkg/os/exec/)

示例 使用Process执行脚本

  1. package main
  2.  
  3. import(
  4. "fmt"
  5. "os"
  6. )
  7.  
  8. func main(){
  9. shellPath :="/home/xx/test.sh"
  10. argv := make([]string,1)
  11. attr :=new(os.ProcAttr)
  12. newProcess,err := os.StartProcess(shellPath,argv,attr)//运行脚本
  13. if err !=nil{
  14. fmt.Println(err)
  15. }
  16. fmt.Println("Process PID",newProcess.Pid)
  17. processState,err := newProcess.Wait()//等待命令执行完
  18. if err !=nil{
  19. fmt.Println(err)
  20. }
  21. fmt.Println("processState PID:",processState.Pid())//获取PID
  22. fmt.Println("ProcessExit:",processState.Exited())//获取进程是否退出
  23. }

使用Cmd执行脚本

  1. package main
  2.  
  3. import(
  4. "fmt"
  5. "os/exec"
  6. )
  7.  
  8. func main(){
  9. shellPath :="/home/xx/test.sh"
  10. command :=exec.Command(shellPath)//初始化Cmd
  11. err := command.Start()//运行脚本
  12. ifnil!= err {
  13. fmt.Println(err)
  14. }
  15. fmt.Println("Process PID:",command.Process.Pid)
  16. err = command.Wait()//等待执行完成
  17. ifnil!= err {
  18. fmt.Println(err)
  19. }
  20. fmt.Println("ProcessState PID:",command.ProcessState.Pid())
  21. }

获取命令返回值

实际上脚本或命令执行完后,会将结果返回到ProcessState中的status去, 但是status不是export的,所以我们需要通过一些手段将脚本返回值从syscall.WaitStatus找出来

  1. ProcessState定义
  2. type ProcessStatestruct{
  3. pid int// The process's id.
  4. status syscall.WaitStatus// System-dependent status info.
  5. rusage *syscall.Rusage
  6. }

对于上面使用Cmd的例子,可以在进程退出后可以通过以下语句获取到返回值

  1. fmt.Println("Exit Code",command.ProcessState.Sys().(syscall.WaitStatus).ExitStatus())

使用Process方式的也可以通过对ProcessState通过相同的方式获取到返回结果。

仔细看文档,一切都包含在里面

如果你想用Python开辟副业赚钱,但不熟悉爬虫与反爬虫技术,没有接单途径,也缺乏兼职经验
关注下方微信公众号:Python编程学习圈,获取价值999元全套Python入门到进阶的学习资料以及教程,还有Python技术交流群一起交流学习哦。

attachments-2022-06-JxX7A6Qq62b0300745376.jpeg