私のシェルスクリプトには次の行があります。
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ですprocessID
。grep
したがって、grep -v grep
2 番目の 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