【问题标题】:Set trap in bash for different process with PID known在 bash 中为已知 PID 的不同进程设置陷阱
【发布时间】:2011-07-10 00:41:20
【问题描述】:

我需要为我在后台启动的 bash 进程设置一个陷阱。后台进程可能会运行很长时间,并将其 PID 保存在特定文件中。

现在我需要为那个进程设置一个陷阱,所以如果它终止,PID文件将被删除。

有什么办法可以做到吗?

编辑 #1

看来我对问题的描述不够准确。我可以完全控制所有代码,但是我拥有的长时间运行的后台进程是这样​​的:

cat /dev/random >> myfile&

当我现在在该语句所在的脚本开头添加陷阱时,$$ 将是那个更大脚本的 PID,而不是我从这里开始的这个小后台进程的 PID。

那么我怎样才能专门为那个后台进程设置陷阱呢?

【问题讨论】:

    标签: bash pid bash-trap


    【解决方案1】:

    你不需要trap在后台进程终止后运行一些命令,你可以通过shell命令行运行并在后台进程之后添加命令,用分号分隔(让这个shell运行后台而不是后台进程)。

    如果您仍然希望在您的 shell 脚本中发送一些通知,例如发送 trap SIGUSR2

    #!/bin/sh
    
    BACKGROUND_PROCESS=xterm         # for my testing, replace with what you have
    
    sh -c "$BACKGROUND_PROCESS; rm -f the_pid_file; kill -USR2 $$" &
    
    trap "echo $BACKGROUND_PROCESS ended" USR2
    
    while sleep 1
    do
        echo -n .
    done
    

    【讨论】:

      【解决方案2】:

      您可以在显式子shell 中运行长时间运行的后台进程,如Petesh 的回答所示,并在此特定子shell 中设置一个陷阱来处理长时间运行的后台进程的退出。父 shell 不受此子 shell 陷阱的影响。

      (
      trap '
        trap - EXIT ERR
        kill -0 ${!} 1>/dev/null 2>&1 && kill ${!}
        rm -f pidfile.pid
        exit
      ' EXIT QUIT INT STOP TERM ERR
      # simulate background process
      sleep 15 & 
      echo ${!} > pidfile.pid
      wait
      ) &
      disown
      
      # remove background process by hand
      # kill -TERM ${!}
      

      【讨论】:

        【解决方案3】:

        将此添加到 Bash 脚本的开头。

        #!/bin/bash
        trap 'rm "$pidfile"; exit' EXIT SIGQUIT SIGINT SIGSTOP SIGTERM ERR
        pidfile=$(tempfile -p foo -s $$)
        echo $$ > "$pidfile"
        # from here, do your long running process
        

        【讨论】:

        • 这里假设被控制的程序是一个bash脚本,你可以修改它。我的工作前提是它不是
        • 你能看看我对我的帖子所做的编辑吗?谢谢
        • @user647434:我会尝试 Petesh 答案的变体。
        【解决方案4】:
        (./jobsworthy& echo $! > $pidfile; wait; rm -f $pidfile)&
        disown
        

        【讨论】:

          猜你喜欢
          • 2019-05-20
          • 2012-03-21
          • 2018-04-11
          • 1970-01-01
          • 2015-06-07
          • 2017-02-15
          • 1970-01-01
          • 1970-01-01
          • 2011-03-21
          相关资源
          最近更新 更多