Linux下, Shell 如何获取mysql的路径?

2016/12/15

描述

  • 目的

写一段自动化shell脚本, 获取mysql的安装bin目录, 比如 /dir1/dir2/mysql/bin/

假设:
1. mysql已经跑起来了
2. 不是从apt-get之类的安装的mysql, 而是自己编译安装的
3. 此时mysql这个命令没有被加到 PATH 中, 因此只能使用绝对路径调用它
  • 思路

    1. 利用 read -p , 由用户输入, (不好, 不自然)

    2. 利用 ps -ef , 然后从中截取到我所需要的目录 (倾向于这个, 但是有几个问题没有解决, 见下文 )

    3. 其他方法( 也许有更好的方法 ? )

  • 问题

    • . 截取的数据不干净( 见相关代码 )

    比如 
    root       813     1  0 Dec13 ?        00:00:00 /usr/bin/abrt-watch-log -F BUG: WARNING: at WARNING: CPU: INFO: possible recursive locking detected ernel BUG at list_del corruption list_add c
    
    能得到
    /usr/bin/abrt-watch-log
    
    然后 dirname
    得到 /usr/bin/
    • 总感觉这个思路很脆弱( 比如做很多前提假设, 不健壮, 脆弱 )

有更好的方法?

相关代码

  • shell脚本, 我的思路

1. ps -ef 输出如下格式
UID     PID    PPID    C  STIME    TTY    TIME    CMD

2. 利用 grep 'mysql' 过滤


3. 利用 cut 或  awk 取需要的数据

上下文环境

  • 产品版本: mysql(自己编译)

  • 操作系统: RedHatLinux

阅读 7.1k
6 个回答

不知道行不行

which mysql

可以从这个思路出发

查找

比如对于ps -ef的输出,查找mysql

查找要求mysql后面有空格,前面允许有路径,最好的情况下前面不会再有其他的可执行文件之类的东西
就是说不会出现/usr/bin/something mysql ....之类的情况

用正则来匹配分隔之后的字符串就是^[a-zA-Z/]*/mysql|^mysql
然后我们的目标就是进程号

路径

/proc/进程号/下面,exe对应就是可执行文件的路径

dirname $(ls -l /proc/$(netstat -plnt|grep mysql|awk '{print $7}'|awk -F/ '{print $1}') |grep exe|awk '{print $11}')

思路:

  1. 使用netstat查找mysql进程,并获取进程号

  2. 拿着进程号到/proc/<进程号>/查看exe的链接地址

  3. dirname获取路径

获得只存在于/dir1/dir2/mysql/bin/下的命令名,假设为 mysqld_safe,然后使用find命令:

find / -name 'mysqld_safe' -exec dirname {} \;
~> ps -ef|grep mysql
mysql     49101      1  0 1月05 ?       00:00:00 /bin/sh /usr/bin/mysqld_safe --basedir=/usr
mysql     49259  49101  0 1月05 ?       00:13:16 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --log-error=/var/log/mariadb/mariadb.log --pid-file=/var/run/mariadb/mariadb.pid --socket=/var/lib/mysql/mysql.sock
root     111469 110713  0 14:56 pts/0    00:00:00 grep --color=auto mysql
~> ps -ef | grep "\/.*/mysqld\> " -o
/usr/libexec/mysqld 
~> 

试试这个

root@precise32:~# ps -ef | grep mysql
root      1320     1  0 02:50 pts/0    00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/usr/local/mysql/data --pid-file=/usr/local/mysql/data/precise32.pid
mysql     1630  1320  0 02:50 pts/0    00:00:00 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/usr/local/mysql/data/precise32.err --pid-file=/usr/local/mysql/data/precise32.pid --socket=/tmp/mysql.sock --port=3306
root      1789  1229  0 03:01 pts/0    00:00:00 grep --color=auto mysql

查询语句:
 ps -ef | grep mysql | grep basedir | awk '{ print $9 }'| cut -d '=' -f2

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题