需要在bash脚本中加入getent命令

时间:2017-12-19 09:17:25

标签: bash

我有任务列出所有正在运行的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

2 个答案:

答案 0 :(得分:0)

您可以强制ps输出数字uid,因此您将始终拥有一个数字用户,然后您可以将其转换为用户名。

请参阅ps。

的手册页

例如,使用ps -eo ruid,cmd

对于数字用户标识,awk的位置参数将为1美元,对于cmd则为2美元。

答案 1 :(得分:0)

像这样编辑你的代码:

#!/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)。如果结果为false,则脚本运行|| echo $i|awk '{print $1}'