Bash脚本没有按预期杀死工作?

时间:2016-06-21 04:16:05

标签: bash

我试图制作一个简单的20行小脚本来重启我的Go程序,这是我到目前为止所做的:

#!/bin/bash
chsum1=""
pid=""

while true ; do
  chsum2=$(find ./ -type f -exec md5 {} \;)
  if [[ $chsum1 != [[$chsum2 ]] ; then
    if [[ $pid != "" ]] ; then
      kill $pid
    fi
    go run main.go &
    pid=$(%%)
    chsum1=$chsum2
    echo "RESTARTED"
  fi
  sleep 2
done

它可以工作但是当它重新启动时,我仍在使用端口。

我不能100%确定我在哪里出错了我对bash没有多少经验

1 个答案:

答案 0 :(得分:0)

你有错误(太多[[):

if [[ $chsum1 != [[$chsum2 ]] ; then

至于kill信号,你发送一个gracefull kill(SIGTERM),所以应用程序不会马上死掉,它会尝试停止所有任务并关闭,但这可能需要一些时间。

我会做一个小循环,检查给定的pid是否仍然存在,并且只有在pid真的死后才重启:

if [[ $pid != "" ]] ; then
  kill $pid
  while ps -p $pid >/dev/null; then
      sleep 1
  done
fi

以上代码将永远循环,因此您可能希望尝试限制循环次数(例如,使用for i in seq 100