2017-12-19 7 views
0

ホストのカップルで実行中のすべてのmariadbプロセスをリストアップし、最後にインスタンス名を持つタスクがあります(インスタンス名はプロセスを実行している同じユーザーです) それのためのスクリプト(下記)。 しかし、この場合、いくつかのホストのusername/instance_nameは3124855のような数字です。この場合、getent passwdコマンドを知っています3124855 | cut -d ':' -f1は数字ではなく正しいユーザー名を表示できます。正しいユーザー名を得るために、このコマンドをスクリプトにどのように置くのが問題なのでしょうか?bashスクリプトでgetentコマンドに参加する必要があります

#!/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 
+1

'sh'は通常' bash'ではありません。 – Cyrus

+0

http://shellcheck.netを使用して、コードをここに掲示する前に確認してください – hek2mgl

答えて

0

あなたは出力に数値のUIDをPSを強制することができますので、あなたは常に数字のユーザは、あなたがして、ユーザー名に変換することができますWICHがあります。

psのマニュアルページを参照してください。

例えば、使用のPS -eoのRUID、その後、数値のユーザーIDのための$ 1とcmdの$ 2になりますawkのため

位置引数をcmdを。このような

0

編集あなたのコード:UIDは数字だけを持っている場合

#!/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') ]をチェックします。真の場合、コード&& echo $(getent passwd ${i} | cut -d':' -f1)が実行されます。 falseの場合、スクリプトを実行します|| echo $i|awk '{print $1}'

関連する問題