The Go Programming Language
› http://golang.org/
› Go Playground
Go Projects
› Revel Web Framework
wuzhewuyou

go exec 控制台直接运行执行命令正常,改成服务后不运行

  •  
  •   wuzhewuyou · Apr 26, 2023 · 3110 views
    This topic created in 1288 days ago, the information mentioned may be changed or developed.

    centos7 检查目标 ip 是否在线的代码,直接运行是正常的,但是改成 service 运行, [Install] WantedBy=multi-user.target

    正常运行时,目标 ip 不在线是打印 exit status 1

    现在不管在线否都是直接打印出 exit status 2

    
    func NetWorkStatus(host string) bool {
    	cmd := exec.Command("ping", host, "-c", "4", "-w", "5")
    	fmt.Println("NetWorkStatus Start:", time.Now().Unix())
    	err := cmd.Run()
    	fmt.Println("NetWorkStatus End  :", time.Now().Unix())
    	if err != nil {
    		fmt.Println(err.Error())
    		return false
    	} else {
    		fmt.Println("Net Status , OK")
    	}
    	return true
    }
    

    看到部分文章提示用到 ICMP ,这需要以管理员身份运行。

    service multi-user.target 这还不是管理员身份么?

    18 replies  •  2023-04-27 18:20:30 +08:00
    elechi
    elechi
    Apr 26, 2023
    1
    是不是 path 环境变量问题,ping 命令找不到
    ysc3839
    ysc3839
    Apr 26, 2023 via Android
    2
    Golang 连个 ping 的包都没吗?一定要调用外部程序?
    seers
    seers
    Apr 26, 2023 via Android
    3
    自己实现一个吧,也不难
    RedisMasterNode
    RedisMasterNode
    Apr 26, 2023
    4
    @ysc3839 是有的 而且还有 > 1k 的 star....
    sadfQED2
    sadfQED2
    Apr 26, 2023 via Android
    5
    目测 99%概率是因为环境变量的问题。

    另外同好奇为啥不用现成的包
    wuzhewuyou
    wuzhewuyou
    OP
    Apr 26, 2023 via Android
    6
    @elechi go run main.go 是正常的,即使程序路径改成 /usr/bin/ping ,症状也一样
    zhangsanfeng2012
    zhangsanfeng2012
    Apr 26, 2023
    7
    域名没办法解析吧
    mogging
    mogging
    Apr 26, 2023 via Android
    8
    我遇到过一次类似的错误,systemd 服务配置加个 privilege 参数就可以了,不妨试试看
    nulIptr
    nulIptr
    Apr 26, 2023
    9
    都用 go 了为啥不直接发 tcp 或者 http 。。。
    0o0O0o0O0o
    0o0O0o0O0o
    Apr 26, 2023 via iPhone
    10
    可以用 systemd-run 来调试排查,ICMP 需要 cap_net_raw ,systemd unit 的编写可以多问问 chatgpt ,它很擅长
    lqhx
    lqhx
    Apr 26, 2023
    11
    err.Error 打印出来是啥?
    感觉和 service 运行时的环境有关
    dode
    dode
    Apr 27, 2023 via Android
    12
    还是跑 docker ,自启动方便啊
    tinyint00
    tinyint00
    Apr 27, 2023
    13
    这个类似的做法,你指定用户试试 user, err := user.Lookup("you user name")

    ```go
    c.clientCmd = exec.Command(name, args...)
    // c.clientCmd.Stdin = os.Stdin
    // c.clientCmd.Stdout = os.Stdout
    // c.clientCmd.Stderr = os.Stderr
    // c.clientCmd = exec.Command("sh")
    fmt.Println(c.clientCmd.String())
    var err error
    user, err := user.Lookup("you user name")
    if err != nil {
    fmt.Println(err, "invalid user", name)
    return
    }

    // var ids_s, _ = user.GroupIds()
    // ids := make([]uint32, len(ids_s), len(ids_s))

    // for k, _ := range ids_s {
    // s, _ := strconv.Atoi(ids_s[k])
    // ids[k] = uint32(s)
    // }

    // 获取用户 id
    uid, err := strconv.ParseUint(user.Uid, 10, 32)
    if err != nil {
    fmt.Println(err)
    }

    // 获取用户组 id
    gid, err := strconv.ParseUint(user.Gid, 10, 32)
    if err != nil {
    fmt.Println(err)
    }
    c.clientCmd.SysProcAttr = &syscall.SysProcAttr{
    // Cloneflags: syscall.CLONE_NEWUTS |
    // syscall.CLONE_NEWIPC |
    // syscall.CLONE_NEWPID |
    // syscall.CLONE_NEWNS |
    // syscall.CLONE_NEWUSER |
    // syscall.CLONE_NEWNET,

    Pdeathsig: syscall.SIGKILL, // linux 下退出后杀死子孙进程 或者设置 {Setpgid: false}
    }

    //设置进程执行用户
    c.clientCmd.SysProcAttr.Credential = &syscall.Credential{
    Uid: uint32(uid),
    Gid: uint32(gid),
    }

    // c.read()

    time.Sleep(time.Second * 2)
    fmt.Println("xxxx")
    err = c.clientCmd.Start()

    if err != nil {
    fmt.Printf("error start: -> %s ", err.Error())
    return
    }

    err = c.clientCmd.Wait()
    if err != nil {
    fmt.Printf("error wait: -> %s ", err.Error())
    return
    }

    ```
    learningman
    learningman
    Apr 27, 2023 via Android
    14
    为啥不用 x net 里的 icmp ,非要调命令行
    lysS
    lysS
    Apr 27, 2023
    15
    少用这种 cmd ,根本没有鲁棒性,而且不好处理。

    https://github.com/prometheus-community/pro-bing
    wuzhewuyou
    wuzhewuyou
    OP
    Apr 27, 2023
    16
    用了 pro-bing 库

    centos7 下面 root 用户和服务启动

    错误提示都是 socket: permission denied
    wuzhewuyou
    wuzhewuyou
    OP
    Apr 27, 2023
    17
    关了 selinux 也不行

    奇了怪 ///
    feelinglucky
    feelinglucky
    Apr 27, 2023
    18
    centos ? selinux 没有关?
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2420 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 46ms · UTC 15:36 · PVG 23:36 · LAX 07:36 · JFK 10:36
    ♥ Do have faith in what you're doing.