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 这还不是管理员身份么?
1
elechi 2023-04-26 17:34:11 +08:00
是不是 path 环境变量问题,ping 命令找不到
|
2
ysc3839 2023-04-26 17:36:15 +08:00 via Android
Golang 连个 ping 的包都没吗?一定要调用外部程序?
|
3
seers 2023-04-26 17:37:49 +08:00 via Android
自己实现一个吧,也不难
|
4
RedisMasterNode 2023-04-26 17:42:06 +08:00
@ysc3839 是有的 而且还有 > 1k 的 star....
|
5
sadfQED2 2023-04-26 17:59:33 +08:00 via Android
目测 99%概率是因为环境变量的问题。
另外同好奇为啥不用现成的包 |
6
wuzhewuyou OP @elechi go run main.go 是正常的,即使程序路径改成 /usr/bin/ping ,症状也一样
|
7
zhangsanfeng2012 2023-04-26 19:34:02 +08:00
域名没办法解析吧
|
8
mogging 2023-04-26 21:24:21 +08:00 via Android
我遇到过一次类似的错误,systemd 服务配置加个 privilege 参数就可以了,不妨试试看
|
9
nulIptr 2023-04-26 21:31:19 +08:00
都用 go 了为啥不直接发 tcp 或者 http 。。。
|
10
0o0O0o0O0o 2023-04-26 21:40:07 +08:00 via iPhone
可以用 systemd-run 来调试排查,ICMP 需要 cap_net_raw ,systemd unit 的编写可以多问问 chatgpt ,它很擅长
|
11
lqhx 2023-04-26 23:49:34 +08:00
err.Error 打印出来是啥?
感觉和 service 运行时的环境有关 |
12
dode 2023-04-27 02:33:43 +08:00 via Android
还是跑 docker ,自启动方便啊
|
13
tinyint00 2023-04-27 08:06:37 +08:00
这个类似的做法,你指定用户试试 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 } ``` |
14
learningman 2023-04-27 09:01:29 +08:00 via Android
为啥不用 x net 里的 icmp ,非要调命令行
|
15
lysS 2023-04-27 16:20:42 +08:00
|
16
wuzhewuyou OP 用了 pro-bing 库
centos7 下面 root 用户和服务启动 错误提示都是 socket: permission denied |
17
wuzhewuyou OP 关了 selinux 也不行
奇了怪 /// |
18
feelinglucky 2023-04-27 18:20:30 +08:00
centos ? selinux 没有关?
|