【问题标题】:Retrieve the Command used to start a process - shell script检索用于启动进程的命令 - shell 脚本
【发布时间】:2019-11-05 08:02:29
【问题描述】:

我需要终止一个进程并使用启动它的相同命令重新启动它。已使用以下命令完成。

但问题是我收到的命令与用于启动的原始命令不同。原始命令带有引号,而我收到的命令不带引号。所以它没有开始。

我不知道为什么?谁能帮我解决这个问题...

下面的脚本:

processes=$(ps aux | grep $1 -i | grep -v grep | grep -v sh | awk '{print $2}')
cntr=0
for i in $processes; do 
        cmd=$(cat /proc/$i/cmdline | tr '\000' ' ')
        kill $i; 
        cmds[$cntr]=$cmd
        cntr=$cntr+1
done

#Restart the process
echo "Commands: " $cmds
for cmd in $cmds; do 
    echo "Starting..." $cmd
    eval "$cmd"
done

原始命令:"/apps/test/bin/" xxxxx

我的命令:/apps/test/bin xxxxx

【问题讨论】:

  • 查杀成功了吗?
  • 是的,杀戮已经完成。唯一的问题是命令中的引号。

标签: linux shell kill-process


【解决方案1】:

上面的代码通过用空格连接参数来重构命令行。这将导致特殊字符再次被重新解析(主要是空格,但也会受到通配符如“*”的影响)。

作为替代方案,考虑使用"${array[@]}" 构造,这将导致数组直接用作参数,无需重新解析。这将处理空格、引号等。

使用 bash,PID $N 的原始命令行,可以重构为:

p=()
while IFS= read -d $'\0' p1 ; do
    p+=("$p1")
done < /proc/$N/cmdline
# Execute, in background sub process
kill ...
"${p[@]}" &

另见Reading null delimited strings through a Bash loop

【讨论】:

  • ps -aux 不用于提取命令行参数。它用于获取PID。正如你所说,我使用 /proc/PID/cmdline 作为参数。我的问题是,我没有像在原始命令中那样获得引号来启动该过程。无论如何,谢谢。
  • @Anitha.R 糟糕——我没有仔细阅读代码。请忽略有关 cmdline 的 cmets。您可以使用解析逻辑,包括执行,重新创建命令行,支持特殊字符等。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多