AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 803247
Accepted
Lawrence Wagerfield
Lawrence Wagerfield
Asked: 2016-09-16 03:23:42 +0800 CST2016-09-16 03:23:42 +0800 CST 2016-09-16 03:23:42 +0800 CST

尽管进程仍在运行,但父 bash 脚本未收到“陷阱”

  • 772

我实际上想要实现的目标:

我正在尝试让自定义守护程序在使用 SysVinit 的系统上运行。我已经有引导程序/etc/init.d/xyz脚本,它调用我的守护程序,但它不会自动将它放在后台。这类似于服务的nginx行为方式:二进制背景本身 - 即/etc/init.d/nginx脚本不负责守护进程,因此如果您/opt/nginx/sbin/nginx直接运行,您也会遇到守护进程/后台执行。

问题

我的问题是,使用我当前的方法,守护进程不会随父进程终止(当您调用 时会终止service xyz stop)。

我正在使用launcher.sh运行脚本的父daemon.sh &脚本。然而,当我杀死继续运行时,尽管我尽了最大努力launcher.sh(它根本不会被调用):daemon.shtrap

-> 启动器.sh

#!/bin/bash

function shutdown {
    # Get our process group id
    PGID=$(ps -o pgid= $$ | grep -o [0-9]*)

    echo THIS NEVER GETS CALLED!

    # Kill process group in a new process group
    setsid kill -- -$$
    exit 0
}

trap "shutdown" SIGTERM

# Run daemon in background

./daemon.sh &

-> 守护进程.sh

#!/bin/bash

while true
do
    sleep 1
done

运行和杀死:

./launcher.sh

<get PID for launcher>

kill -TERM 123 # PID of launcher.sh... which _is_ still running and has its own PID.

结果:daemon.sh仍在运行并且shutdown函数永远不会被调用 - 我之前已经通过echo here在函数体中放置一个来确认这一点。

有任何想法吗?

编辑:脚本launcher.sh正在使用 运行daemon launcher.sh,其中daemon是 Amazon Linuxinit.d/functions文件提供的函数(参见此处: http: //gist.github.com/ljwagerfield/ab4aed16878dd9a8241b14bc1501392 ‌​f)。

linux unix bash shell daemon
  • 2 2 个回答
  • 1480 Views

2 个回答

  • Voted
  1. Best Answer
    J Earls
    2016-09-16T04:26:07+08:002016-09-16T04:26:07+08:00

    该trap命令仅在脚本运行时才有效。

    通常这样做的方式是,当守护进程被分叉时,它将其 PID 写入文件。然后,init 脚本要么使用该文件来确定要终止的进程,要么调用您的启动器脚本来终止该进程。

    对于第一种情况:

    启动器.sh:

    /path/to/daemon.sh &
    echo "$!" > /var/run/xyz.pid
    

    一个简单且有点幼稚的版本/etc/init.d/xyz:

    # ... pull in functions or sysconfig files ...
    start() {
        # ... do whatever is needed to set things up to start ...
        /path/to/launcher.sh
    }
    stop() {
        # ... do whatever is needed to set things up to stop ...
        kill `cat /var/run/xyz.pid`
    }
    # ... other functions ...
    

    非天真的启动脚本将取决于您正在运行的 linux 版本;我建议查看其他示例,/etc/init.d看看他们是如何做到这一点的。

    • 1
  2. Ryan Babchishin
    2016-09-16T04:16:10+08:002016-09-16T04:16:10+08:00

    为什么你想要两个脚本来做这件事对我来说没有意义。你可以只调用daemon.sh &你的初始化脚本吗?或者,也许您可​​以使用该daemon命令。

    NAME
           daemon - turns other processes into daemons
    
    SYNOPSIS
            usage: daemon [options] [--] [cmd arg...]
    

    如果您需要使用陷阱,也许您可​​以使用它daemon.sh来彻底关闭。很难判断这些是您的真实脚本还是只是示例。

    问题的一部分launcher.sh是它退出了......没有任何东西让它运行,所以你不能杀死它 - 它已经消失了。我不只是这么说,我实际上测试了你的脚本以确保在我回答之前。请参阅我添加到您的脚本中的评论。

    #!/bin/bash
    
    function shutdown {
        # Get our process group id
        PGID=$(ps -o pgid= $$ | grep -o [0-9]*)
    
        echo THIS NEVER GETS CALLED!
    
        # Kill process group in a new process group
        setsid kill -- -$$
        exit 0
    }
    
    trap "shutdown" SIGTERM
    
    # Run daemon in background *** script keeps running ***
    
    ./daemon.sh &
    
    # It exits here
    echo "Exiting... bye!"
    
    • 0

相关问题

  • 你最喜欢的 Linux 发行版是什么?[关闭]

  • 更改 PHP 的默认配置设置?

  • 保护新的 Ubuntu 服务器 [关闭]

  • (软)Ubuntu 7.10 上的 RAID 6,我应该迁移到 8.10 吗?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve