我在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'命令'”,如下所示:
su user -c "ps -ef | grep Bootstrap | grep -v grep | awk '{print $2}' > tomcat.pid"
每当我这样做时,“awk”部分似乎不起作用。它不是仅仅检索PID,而是捕获整个过程信息。为什么是这样?我该如何修复命令?
答案 0 :(得分:3)
问题是在发送给新用户之前,原始shell正在处理$2
。由于shell中$2
的值为空,因此目标shell上的awk
命令基本上变为awk {print }
。要修复它,您只需转义$2
:
su user -c "pushd $TOMCAT_HOME;ps -ef | grep Bootstrap | grep -v grep | awk '{print \$2}' > $TOMCAT_HOME/bin/tomcat.pid"
请注意,您希望原始shell处理$TOMCAT_HOME
,以便正确设置其值。
答案 1 :(得分:0)
您不需要pushd命令,因为您可以使用以下命令替换awk命令:
cut -d\ -f2
注意:-d\
和-f2
之间有两个空格