温馨提示:本文翻译自stackoverflow.com,查看原文请点击:bash - Change the name of a script in memory OR other work around
bash process scripting

bash - 更改内存中脚本的名称或其他解决方法

发布于 2020-04-14 16:31:04

因此,我有一个脚本,该脚本首先使用awk和ps搜索自身,如果发现任何实例,则杀死每个实例,否则,则执行任何实例。问题在于,由于运行脚本的操作会创建一个进程,因此它总是会找到其自身的实例,因此它永远不会真正执行其他操作并进入杀死自己的循环。

问题是:有没有办法我可以更改正在运行的进程的名称?还是有其他解决此永恒循环的方法?

剧本

#!/bin/bash


asd=$(ps aux | grep -v "color=auto" | grep "S\|R\|S+" | grep "bash asd.sh" | awk '{print $2}')
echo $asd
if [  -z "$asd" ]
  then
    while true
      do
        a=$(docker ps -a | awk '/137/ {print $1}')
        ## si container "a" esta parado por error 137, reiniciar
        if [ ! -z "$a" ]
          then
            docker restart $a
            echo "se reinicio el container $a, fallo por falta de memoria (error 137)"
        fi
        sleep 500
    done &
else
  echo " #### Matando Script #### "
  sudo  kill $asd
fi

查看更多

提问者
El_Manuel0
被浏览
69
franzisk 2020-02-03 23:14

不要检查进程是否正在运行,请检查有多少进程正在运行。如果超过一个,则表示它正在运行,因为其中一个属于$ 0(实际脚本)。
这是我的解决方案,我在ps命令中添加了wc -l(计数输出行)

#!/bin/bash


asd=$(ps aux | grep -v "color=auto" | grep "S\|R\|S+" | grep "bash asd.sh" | awk '{print $2}' | wc -l)
echo $asd
if [ "$asd" -gt "1" ]
  then
    while true
      do
        a=$(docker ps -a | awk '/137/ {print $1}')
        ## si container "a" esta parado por error 137, reiniciar
        if [ ! -z "$a" ]
          then
            docker restart $a
            echo "se reinicio el container $a, fallo por falta de memoria (error 137)"
        fi
        sleep 500
    done &
else
  echo " #### Matando Script #### "
  sudo  kill $asd
fi