【问题标题】:Why does my daemon only run one instance?为什么我的守护进程只运行一个实例?
【发布时间】:2016-03-03 23:22:45
【问题描述】:

我目前正在使用/etc/init.d 中的skeleton 在我的计算机启动时启动一个守护进程。我需要守护进程来运行三个实例。在我的骨架中,我已将 start 函数中的代码更改为:

cd dir1 ; start-stop-daemon -b --start --quiet --pidfile ${PIDFILE}1 --exec $DAEMON -- \
                  $DAEMON_ARGS \
                  || return 2 ;
cd dir2 ; start-stop-daemon -b --start --quiet --pidfile ${PIDFILE}2 --exec $DAEMON -- \
                  $DAEMON_ARGS \
                  || return 2 ;
cd dir3 ; start-stop-daemon -b --start --quiet --pidfile ${PIDFILE}3 --exec $DAEMON -- \
                  $DAEMON_ARGS \
                  || return 2 ;

因为我的 DAEMON 变量指向我控制的二进制文件,所以我毫无疑问地知道每个实例至少运行一段时间。但是当系统最终启动时,我只能看到一个正在运行的进程实例。我还查看了 start-stop-daemon 的手册页,如果指定了 --pidfile,它不应该杀死已经运行的实例。我也在使用-b,并且我已经测试了我的守护程序脚本,我直接使用run.sh start 执行它。之后,我可以看到三个进程按预期运行。

如何让所有三个实例都留下?

【问题讨论】:

    标签: linux daemon


    【解决方案1】:

    由于我不知道你的 DAEMON 是做什么的,所以我将尝试猜测并尝试提供以 If 开头的答案。

    如果您的 DAEMON 应用具有网络功能并且使用 TCP,则它需要一个 PORT。由于 TCP 是基于连接的,如果 DAEMON 正在使用该端口进行侦听,则不能再次使用相同的端口。如果您尝试这样做,则可能是您启动了该 DAEMON 的新实例并且一个已经在使用 PORT,您的新实例可能正在崩溃,或者您之前的实例可能正在崩溃。

    如果是这种情况,另一种可能是,如果您的 DAEMON 可以选择传入备用端口进行侦听,您可以侦听不同的端口。但是,请记住,任何尝试发送到它的端点都需要知道它应该发送到哪些端口。另外,您必须在 IPTables 或您可能使用的任何其他端口中打开这些端口,以允许数据到达您的 DAEMON。

    如果它基于 UDP,并且您为您的 DAEMON 进行软件开发,则具有更大的灵活性。

    【讨论】:

    • 里面没有任何网络。只是一个应该在后台执行并使用几个文件的程序。
    【解决方案2】:

    拥有 pidfile 的目的通常是阻止启动多个实例。在您的情况下,您实际上想要三个,但您已为它们分配了相同的 pidfile。

    --pidfile ${PIDFILE}1

    尝试将其他两个更改为

    --pidfile ${PIDFILE}2

    --pidfile ${PIDFILE}3

    编辑: 这是一个如何/为什么应该工作的示例:

    root# cat > foobar.sh << EOF
    #!/bin/sh
    sleep 60
    EOF
    root# start-stop-daemon -b -m --pidfile /var/run/p1 --exec /home/qwerty/foobar.sh --start
    root# start-stop-daemon -b -m --pidfile /var/run/p2 --exec /home/qwerty/foobar.sh --start
    root# start-stop-daemon -b -m --pidfile /var/run/p3 --exec /home/qwerty/foobar.sh --start
    root# cat /var/run/p1 /var/run/p2 /var/run/p3
    6307
    6316
    6320
    root# ps auxgww | grep foobar
    root      6307  0.0  0.0   4440   656 ?        S    00:09   0:00 /bin/sh /home/qwerty/foobar.sh
    root      6316  0.0  0.0   4440   656 ?        S    00:09   0:00 /bin/sh /home/qwerty/foobar.sh
    root      6320  0.0  0.0   4440   656 ?        S    00:09   0:00 /bin/sh /home/qwerty/foobar.sh
    root      6330  0.0  0.0  11740   936 pts/0    S+   00:09   0:00 grep --color=auto foobar
    

    【讨论】:

    • 抱歉,我实际上已经在我的脚本中包含了它,但它没有修复它:/ 我早先想到并尝试了它。
    • 奇怪,它应该适合你。 PIDFILE 和 DAEMON 设置是否正确?它们应该是绝对路径,例如/var/run/mydaemon1.pid 和 /usr/sbin/mydaemon。现在,看到cd dir2 表明它们是相对的。
    • 不,它们是绝对的。我为我的例子道歉,我基本上把它从代码中删掉了,而且编辑得很差。
    • 用一个工作示例编辑了答案。在创建它时,我还看到你没有 -m 标志,因为你有 -b,所以你可能想要它。
    • 这个例子可以在你的shell中运行,但是启动时就不一样了。我写道我可以手动测试样本;它工作得很好,就像我尝试编辑它之前一样——但只有当我在我的 shell 中运行它时。我只能看到一个进程实例在启动后运行。
    【解决方案3】:

    事实证明,以下最终成为解决方案:

    cd /tmp/dir1 && start-stop-daemon -b --start --quiet --pidfile ${PIDFILE}1 --make-pidfile --exec ${DAEMON}1 -- \
              $DAEMON_ARGS ;
    cd /tmp/dir2 && start-stop-daemon -b --start --quiet --pidfile ${PIDFILE}2 --make-pidfile --exec ${DAEMON}2 -- \
              $DAEMON_ARGS ;
    cd /tmp/dir3 && start-stop-daemon -b --start --quiet --pidfile ${PIDFILE}3 --make-pidfile --exec ${DAEMON}3 -- \
              $DAEMON_ARGS ;
    

    我忘了带||在每个命令的末尾返回 2 部分,我不知道 start-stop-daemon 返回的是什么,因为它正在由系统在启动时执行。

    【讨论】:

      猜你喜欢
      • 2023-03-02
      • 2017-12-04
      • 2014-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-13
      • 2015-12-17
      相关资源
      最近更新 更多