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

问题描述 投票:0回答:2

我有任务列出所有正在运行的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
bash
2个回答
0
投票

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

请参见ps的手册页。

例如,使用ps -eo ruid,cmd

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


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)。如果它是假的,脚本运行|| echo $i|awk '{print $1}'

© www.soinside.com 2019 - 2024. All rights reserved.