Shell-Script
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
和我正在執行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