我的 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
文件内会被忽略。
答案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