Shell-Script

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

  • June 11, 2021

我的 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和我正在執行processID的程序ID。grep因此,grep -v grep為了避免獲得第二個 processID,但它在.sh文件中被忽略。

建議一個更好的方法來獲得你想要的 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

引用自:https://unix.stackexchange.com/questions/653605