如何让“awk”在“su -c”命令中正常工作?

时间:2013-08-16 12:24:09

标签: linux unix jenkins

我在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,而是捕获整个过程信息。为什么是这样?我该如何修复命令?

2 个答案:

答案 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之间有两个空格