Shell脚本命令从命令行输出输出差异

时间:2018-02-21 13:12:10

标签: linux shell

操作系统:RHEL 7.3。我在命令下运行:

ps uax | grep 'elasticsearch' | grep -v grep | awk '{print $2}'

如果我在终端上运行此命令,我会获得一个Elasticsearch进程的PID。但是,如果我将相同的命令放入shell脚本中,那么:

#!/bin/bash

PID=$(ps uax | grep 'elasticsearch' | grep -v grep | awk '{print $2}')
echo $PID

我得到了一个低于其他的PID。可能出现什么问题?

启动ES的完整脚本如下:

#!/bin/bash

if [ "$ES_HOME" == "" ]; then
        echo "ES_HOME environment variable does not exists. Please set it to home dir of Elasticsearch and try again"
fi;

PID=$(ps aux | grep "elasticsearch" | grep -vE "start|grep" | awk '{print $2}' | xargs)
if [ "$PID" != "" ]; then
        echo "Elasticsearch is already running with PID: $PID"
        echo ""
        exit;
fi;

echo "Starting Elasticsearch"
sh $ES_HOME/bin/elasticsearch.sh > /dev/null &

2 个答案:

答案 0 :(得分:0)

在您的脚本中,您在bash shell #!/bin/bash中运行它,只需在手动执行时检查当前的shell是什么。如果不同,则相应地更改shell。否则我没有看到任何区别。还要检查运行脚本时使用的用户ID。

答案 1 :(得分:0)

如果您的计算机上pgrep不可用,则可以使用ps而不grep仅使用pid来获取进程的name。< / p>

例如,

 #!/bin/bash

_pid=$(ps -C NetworkManager -o pid=)
echo "$_pid"

NetworkManager是在使用ps时将在流程表中看到的命令的名称。您可以将其替换为elasticsearch