【问题标题】:How do I get "awk" to work correctly within a "su -c" command?如何让“awk”在“su -c”命令中正常工作?
【发布时间】:2013-08-16 12:24:08
【问题描述】:

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

【问题讨论】:

    标签: linux unix jenkins


    【解决方案1】:

    问题是 $2 在发送给新用户之前正在由原始 shell 处理。由于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"
    

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

    【讨论】:

      【解决方案2】:

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

      cut -d\  -f2
      

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

      【讨论】:

      • 这个sn-p不需要pushd。该命令还有更多未显示的内容,因此它看起来与上下文无关,但对于随后的几个命令是必需的。很抱歉。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      相关资源
      最近更新 更多