grep -v 在 shell 脚本中不起作用

grep -v 在 shell 脚本中不起作用

我的 shell 脚本中有这一行:

tomcatPID=$(ps -ef | grep tomcat | grep $TOMCAT_ACCOUNT | grep -v grep | grep -v restart | awk '{print $2}')

我确认该$TOMCAT_ACCOUNT部分没有问题。我遇到的问题是grep -v。这在终端中有效,但当我将其放入 shell 脚本中时,它会忽略它grep并给出包含它的结果。

问题是:为什么grep -v在 shell 脚本中被忽略,但在终端上却工作正常?

例如:

假设我在 下工作become application,所以application@servername在我运行的终端中:

tomcatPID=$(ps -ef | grep tomcat | grep application | grep -v grep | grep -v restart | awk '{print $2}')

输出:42345仅是运行我的应用程序的 tomcat 的 processID。

如果我创建file.sh并在里面我有完全相同的:

tomcatPID=$(ps -ef | grep tomcat | grep $TOMCAT_ACCOUNT | grep -v grep | grep -v restart | awk '{print $2}')

然后使用以下命令运行它:./file.sh 输出:42345 6534这是我的进程IDtomcat和我正在运行的进程processIDID 。grep因此,可以避免grep -v grep获取第二个 processID,但它在.sh文件内会被忽略。

答案1

建议使用更好的方法来获取所需的 PID pgrep。这个例子会找到我的java tomcat进程

TOMCAT_ACCOUNT=tomcat
ps -fu "$TOMCAT_ACCOUNT"
UID        PID  PPID  C STIME TTY          TIME CMD
tomcat     678     1  0 Jun04 ?        00:47:49 /usr/lib/jvm/java-11-openjdk-amd64/bin/java -Dja
tomcat    1900   678  0 Jun04 ?        00:00:02 /usr/lib/libreoffice/program/soffice.bin --accep

pgrep -u "$TOMCAT_ACCOUNT" java
678

如果您有非常特殊的要求(它必须tomcat在用户运行的进程命令中$_TOMCAT_ACCOUNT并且不得包含restart该行中的任何位置),您可以使用此

TOMCAT_ACCOUNT=tomcat
ps -fu "$TOMCAT_ACCOUNT" | awk '/.[t]omcat/ && !/[r]estart/ {print $2}'
678

相关内容