为什么我的守护进程只运行一个实例?

时间:2016-03-03 23:22:45

标签: linux daemon

我正在使用skeleton中的/etc/init.d来启动计算机启动时的守护程序。我需要守护进程运行三个实例。在我的骨架中,我已将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执行它。在此之后,我可以看到三个进程按预期运行。

如何保留所有三个实例?

3 个答案:

答案 0 :(得分:0)

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

  

- 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

答案 1 :(得分:0)

由于我不知道你的DAEMON做了什么,我会尝试猜测并尝试从单词If开始提供答案。

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

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

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

答案 2 :(得分:0)

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

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返回了什么,因为系统在启动时正在执行它。