我有任务列出所有正在运行的mariadb进程在几个主机中,最后有实例名称(实例名称是相同的用户正在运行进程)我能够为它编写一个脚本(如下)。但在这种情况下,在某些主机中,username / instance_name是相等的数字,例如3124855.在这种情况下,我知道命令getent passwd 3124855 | cut -d':' - f1可以为我打印正确的用户名而不是数字。如何将此命令放入脚本以始终获取正确的用户名?
#!/bin/sh
result=$(ps -ef|grep "mysqld"|grep -v grep|awk '{print $8}')
if [ -z "${result}" ] ; then
echo "no_instances"
exit 0
else
OIFS=$IFS
IFS=$'\n'
for i in $(ps -ef|grep "mysqld"|grep -v grep); do
if [[ $(`echo $i|awk '{print $8}'` --version) == *"MariaDB"* ]]; then
echo $i|awk '{print $1}'
fi
done
IFS=$OIFS
fi
您可以强制ps输出数字uid,因此您将始终拥有一个数字用户,然后您可以将其转换为用户名。
请参见ps的手册页。
例如,使用ps -eo ruid,cmd
对于数字用户标识,awk的位置参数将为1美元,对于cmd则为2美元。
像这样编辑你的代码:
#!/bin/bash
result=$(ps -ef|grep "mysqld"|grep -v grep|awk '{print $8}')
if [ -z "${result}" ] ; then
echo "no_instances"
exit 0
else
OIFS=$IFS
IFS=$'\n'
for i in $(ps -ef|grep "mysqld"|grep -v grep); do
if [[ $(`echo $i|awk '{print $8}'` --version) == *"MariaDB"* ]]; then
[ -z $(echo "${i}" | awk '{print $1}' | sed -r 's/^[0-9]+$//g') ] && echo $(getent passwd ${i} | cut -d':' -f1) || echo $i|awk '{print $1}'
fi
done
IFS=$OIFS
fi
收缩[ -z $(echo "${i}" | awk '{print $1}' | sed -r 's/^[0-9]+$//g') ]
将检查UID是否只有数字。如果是真的,将执行代码&& echo $(getent passwd ${i} | cut -d':' -f1)
。如果它是假的,脚本运行|| echo $i|awk '{print $1}'