How to ping remote mysql using golang

huangapple go评论132阅读模式
英文:

How to ping remote mysql using golang

问题

我正在使用go来ping一些Linux机器。
但是它的工作不准确,因为它总是需要近10秒钟才能连接到远程的mysql。

我使用的命令是:

mysql -u USER -p PASSWORD -h REMOTE_IP

所以我想知道如何使用Linux命令来判断它是否打开。

然后我将使用golang的exec.Command来执行这个命令。

这是我的ping代码:

  1. package main
  2. import (
  3. "errors"
  4. "fmt"
  5. "github.com/tatsushid/go-fastping"
  6. "net"
  7. "net/smtp"
  8. "strings"
  9. "time"
  10. )
  11. func main(){
  12. err := ping("192.168.2.1")
  13. if err != nil{
  14. fmt.Println("WARNING!!!!!!")
  15. }
  16. }
  17. func ping(ip string) error {
  18. p := fastping.NewPinger()
  19. ra, err := net.ResolveIPAddr("ip", ip)
  20. if err != nil {
  21. return err
  22. }
  23. p.AddIPAddr(ra)
  24. found := false
  25. p.OnRecv = func(addr *net.IPAddr, rtt time.Duration) {
  26. found = true
  27. }
  28. err = p.Run()
  29. if err != nil {
  30. return err
  31. }
  32. if !found {
  33. return errors.New("response error")
  34. }
  35. return nil
  36. }
英文:

I am using go to ping some Linux machines.
But it is not work accurate, because it always needs almost 10 seconds to connect the remote mysql.

I use this command:

> mysql -u USER -p PASSWORD -h REMOTE_IP

So i want to know how to use linux command to know whether it open or not.

Then I will use golang 's exec.Command to do that .

Here is my ping code:

  1. package main
  2. import (
  3. "errors"
  4. "fmt"
  5. "github.com/tatsushid/go-fastping"
  6. "net"
  7. "net/smtp"
  8. "strings"
  9. "time"
  10. )
  11. func main(){
  12. err := ping("192.168.2.1")
  13. if err != nil{
  14. fmt.Println("WARNING!!!!!!")
  15. }
  16. }
  17. func ping(ip string) error {
  18. p := fastping.NewPinger()
  19. ra, err := net.ResolveIPAddr("ip", ip)
  20. if err != nil {
  21. return err
  22. }
  23. p.AddIPAddr(ra)
  24. found := false
  25. p.OnRecv = func(addr *net.IPAddr, rtt time.Duration) {
  26. found = true
  27. }
  28. err = p.Run()
  29. if err != nil {
  30. return err
  31. }
  32. if !found {
  33. return errors.New("response error")
  34. }
  35. return nil
  36. }

答案1

得分: 4

我假设你想知道mysql是否可达。你可以使用以下示例代码:

  1. package main
  2. import (
  3. "database/sql"
  4. "flag"
  5. "fmt"
  6. "log"
  7. _ "github.com/go-sql-driver/mysql"
  8. )
  9. func main() {
  10. var (
  11. server = flag.String("mysql", "localhost:3306", "mysql服务器")
  12. user = flag.String("user", "root", "mysql用户")
  13. pass = flag.String("password", "", "mysql密码")
  14. )
  15. flag.Parse()
  16. db, err := sql.Open("mysql", fmt.Sprintf("%s:%s@tcp(%s)/", *user, *pass, *server))
  17. if err != nil {
  18. log.Fatalln(err)
  19. }
  20. defer db.Close()
  21. err = db.Ping()
  22. if err != nil {
  23. log.Fatalln(err)
  24. } else {
  25. log.Println("mysqld is alive")
  26. }
  27. }

这段代码用于检查mysql是否可达。你可以根据需要修改服务器地址、用户名和密码。

英文:

I assume you want to know if mysql is reachable or not. You can use following example:

  1. package main
  2. import (
  3. "database/sql"
  4. "flag"
  5. "fmt"
  6. "log"
  7. _ "github.com/go-sql-driver/mysql"
  8. )
  9. func main() {
  10. var (
  11. server = flag.String("mysql", "localhost:3306", "mysql server")
  12. user = flag.String("user", "root", "mysql user")
  13. pass = flag.String("password", "", "mysql password")
  14. )
  15. flag.Parse()
  16. db, err := sql.Open("mysql", fmt.Sprintf("%s:%s@tcp(%s)/", *user, *pass, *server))
  17. if err != nil {
  18. log.Fatalln(err)
  19. }
  20. defer db.Close()
  21. err = db.Ping()
  22. if err != nil {
  23. log.Fatalln(err)
  24. } else {
  25. log.Println("mysqld is alive")
  26. }
  27. }

答案2

得分: 2

如果你只需要检查与特定主机和端口的连接,你可以这样做:

  1. package main
  2. import (
  3. "fmt"
  4. "net"
  5. )
  6. const (
  7. host = "192.168.2.1"
  8. port = "3306" // 默认的MySQL端口
  9. )
  10. func main() {
  11. conn, err := net.Dial("tcp", host+":"+port)
  12. if err != nil {
  13. panic(err)
  14. }
  15. defer conn.Close()
  16. fmt.Printf("已连接到 %s \n", conn.RemoteAddr().String())
  17. }

希望对你有帮助!

英文:

If you just need to check connection to a specific host & port, you can do this as:

  1. package main
  2. import (
  3. "fmt"
  4. "net"
  5. )
  6. const (
  7. host = "192.168.2.1"
  8. port = "3306" // default MySQL port
  9. )
  10. func main() {
  11. conn, err := net.Dial("tcp", host+":"+port)
  12. if err != nil {
  13. panic(err)
  14. }
  15. defer conn.Close()
  16. fmt.Printf("Connected to %s \n", conn.RemoteAddr().String())
  17. }

huangapple
  • 本文由 发表于 2016年12月9日 13:43:37
  • 转载请务必保留本文链接:https://go.coder-hub.com/41053830.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定