V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
wuzhewuyou

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

  •  
  •   wuzhewuyou · Apr 26, 2023 · 2515 views
    This topic created in 1100 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
        1
    elechi  
       Apr 26, 2023
    是不是 path 环境变量问题,ping 命令找不到
    ysc3839
        2
    ysc3839  
       Apr 26, 2023 via Android
    Golang 连个 ping 的包都没吗?一定要调用外部程序?
    seers
        3
    seers  
       Apr 26, 2023 via Android
    自己实现一个吧,也不难
    RedisMasterNode
        4
    RedisMasterNode  
       Apr 26, 2023
    @ysc3839 是有的 而且还有 > 1k 的 star....
    sadfQED2
        5
    sadfQED2  
       Apr 26, 2023 via Android
    目测 99%概率是因为环境变量的问题。

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

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

    centos7 下面 root 用户和服务启动

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

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