加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

如何在bash中重启进程或在命令中终止它?

发布时间:2020-12-15 21:00:45 所属栏目:安全 来源:网络整理
导读:我有一个跟踪进程的脚本,如果该进程终止,它将重新生成它.我希望跟踪脚本也可以通过为跟踪脚本提供一个sigterm(例如.)来告知进程.换句话说,如果我杀死跟踪脚本,它也应该杀死它正在跟踪的进程,而不是重新生成并退出. 将几个帖子(我认为是最佳做法,例如不使用PI
我有一个跟踪进程的脚本,如果该进程终止,它将重新生成它.我希望跟踪脚本也可以通过为跟踪脚本提供一个sigterm(例如.)来告知进程.换句话说,如果我杀死跟踪脚本,它也应该杀死它正在跟踪的进程,而不是重新生成并退出.

将几个帖子(我认为是最佳做法,例如不使用PID文件)拼凑在一起,我得到以下内容:

#!/bin/bash

DESC="Foo Manager"
EXEC="python /myPath/bin/FooManager.pyc"

trap "BREAK=1;pkill -HUP -P $BASHPID;exit 0" SIGHUP SIGINT SIGTERM

until $EXEC
do
    echo "Server $DESC crashed with exit code $?.  Restarting..." >&2
    ((BREAK!=0)) && echo "Breaking" && exit 1
    sleep 1
done

所以,现在如果我在一个xterm中运行这个脚本.然后在另一个xterm中我发送脚本:

kill -HUP <tracking_script_pid>  # Doesn't work.
kill -TERM <tracking_script_pid>  #Doesn't work.

跟踪脚本不会结束或任何事情.如果我从命令行运行FooManager.pyc,它将在SIGHUP和SIGTERM上死亡.无论如何,我在这里可能做错了什么,也许还有一种完全不同的方式呢?

谢谢.

解决方法

从手册:

If Bash is waiting for a command to complete and receives a signal for which a trap has been set,the trap will not be executed until the command completes. When Bash is waiting for an asynchronous command via the wait builtin,the reception of a signal for which a trap has been set will cause the wait builtin to return immediately with an exit status greater than 128,immediately after which the trap is executed.

强调是我的.

因此,在您的情况下,当您的命令执行时,Bash将等到它结束才触发陷阱.

要解决此问题,您需要将程序作为作业运行,并等待它.如果你的程序永远不会以大于128的返回码退出,你可以简化以下代码,但我不是这样做的假设:

#!/bin/bash

desc="Foo Manager"
to_exec=( python "/myPath/bin/FooManager.pyc" )

trap 'trap_triggered=true' SIGHUP SIGINT SIGTERM

trap_triggered=false
while ! $trap_triggered; do
   "${to_exec[@]}" &
   job_pid=$!
   wait $job_pid
   job_ret=$?
   if [[ $job_ret = 0 ]]; then
      echo >&2 "Job ended gracefully with no errors... quitting..."
      break
   elif ! $trap_triggered; then
      echo >&2 "Server $desc crashed with exit code $job_ret. Restarting..."
   else
      printf >&2 "Received fatal signal... "
      if kill -0 $job_pid >&/dev/null; then
          printf >&2 "killing job $job_pid... "
          kill $job_pid
          wait $job_pid
      fi
      printf >&2 "quitting...n"
   fi
done

笔记.

>我使用小写变量名,因为大写被认为是不好的做法:它们可能与Bash的保留名称或环境变量冲突.>我没有使用字符串来存储命令,而是使用数组.使用字符串,如果您希望将空格作为参数传递,则会遇到很多问题.使用正确引用的数组,您将不会遇到任何问题. (有些人认为使用函数会更好.)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读