0

我在 Jenkins 构建结束时运行一个脚本来重新启动 Tomcat。众所周知,Tomcat 的 shutdown.sh 脚本在许多情况下都不能正常工作,因此我的脚本应该捕获 Tomcat 进程的 PID,然后尝试手动关闭它。这是我用来捕获 PID 的命令:

ps -ef | grep Bootstrap | grep -v grep | awk '{print $2}' > tomcat.pid

手动运行时的输出完美地检索了 PID。在 Jenkins 构建期间,我必须切换用户才能运行该命令。我正在使用“su user -c 'commands'”,如下所示:

su user -c "ps -ef | grep Bootstrap | grep -v grep | awk '{print $2}' > tomcat.pid"

但是,每当我这样做时,“awk”部分似乎都不起作用。它不只是检索 PID,而是捕获整个过程信息。为什么是这样?如何修复命令?

4

2 回答 2

4

问题是$2原始外壳在发送给新用户之前正在处理它。由于$2shell 中 的值为空,awk因此目标 shell 中的命令实质上变为awk {print }. 要修复它,您只需逃避$2

su user -c "pushd $TOMCAT_HOME;ps -ef | grep Bootstrap | grep -v grep | awk '{print \$2}' > $TOMCAT_HOME/bin/tomcat.pid"

请注意,您希望$TOMCAT_HOME由原始 shell 处理,以便正确设置它的值。

于 2013-08-16T12:30:52.527 回答
0

您不需要 pushd 命令,因为您可以将 awk 命令替换为:

cut -d\  -f2

-d\注意: and之间有两个 2 空格-f2

于 2013-08-16T12:32:00.000 回答