grep -vがシェルスクリプトで機能しない

grep -vがシェルスクリプトで機能しない

私のシェルスクリプトには次の行があります。

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

$TOMCAT_ACCOUNTその部分には問題がないことが確認されました。私が経験している問題はgrep -v。これは端末で動作しますが、シェルスクリプトに入れるとそれを無視し、grepそれを含む結果が得られます。

問題はgrep -vシェルスクリプトでは無視されますが、端末でうまく機能するのはなぜですか?

たとえば、

私は以下で作業していると仮定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と私が実行しているプロセスIDですprocessIDgrepしたがって、grep -v grep2 番目の 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

関連情報