【问题标题】:Bash SIGUSR1 loop scriptBash SIGUSR1 循环脚本
【发布时间】:2021-08-09 10:37:16
【问题描述】:

我在 3 到 4 天前开始学习 bash,我有一项很难完成的任务。我需要编写一个脚本,运行一个循环,在收到 SIGUSR1 信号后,它应该打印进程 ID 并退出。如果我能得到一些帮助,我将非常感激。

【问题讨论】:

  • 你能用你的代码更新你的帖子吗?
  • 我所写的所有内容都没有接近最终结果。粘贴代码没什么意义
  • 查找trapexit命令,以及特殊参数$$
  • @p0int 然后添加一个trap 命令,当收到SIGUSR1 时输出一些东西。从那个起点继续。还要确保您了解 shell 引用以及“单词”是什么。

标签: linux bash shell loops signals


【解决方案1】:

您可以添加trap命令,以便在收到信号时执行命令:

trap 'echo "Hmm, SIGUSR1??!"' SIGUSR1

为了让代码更简洁,让我们用一个函数来做这件事:

exit_program(){
    echo "Here is the PID: $$"
    exit
}

如何调用trap中的函数?

trap "exit_program" SIGUSR1

希望这会有所帮助:

#!/usr/bin/env bash

# Cancel Program
exit_program(){
    echo "Here is the PID: $$"
    exit
}

# Reciever
trap "exit_program" SIGUSR1

【讨论】:

    【解决方案2】:

    你会这样做:

    #!/usr/bin/env bash
    
    # Our USR1 signal handler
    usr1_trap(){
        printf 'Here is the PID: %d\nExiting right-now!\n' $$
        exit
    }
    
    # Register USR1 signal handler
    trap usr1_trap USR1
    
    printf 'Run this to stop me:\nkill -USR1 %d\n' $$
    
    # Wait in background, not consuming CPU
    while :; do
       sleep 9223372036854775807 & # int max (2^63 - 1)
       wait $!
    done
    

    【讨论】:

    • 非常感谢您的回答,但是当我使用 pid 输入 kill 命令时,没有任何反应。我仍然停留在代码中。知道为什么会这样吗?
    • @p0int 您的外壳/操作系统名称是什么? zsh 是 MacOS shell 不知道 infinitysleep。所以给它一个大的整数值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-17
    • 2020-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多