我正在使用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
执行它。在此之后,我可以看到三个进程按预期运行。
如何保留所有三个实例?
答案 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返回了什么,因为系统在启动时正在执行它。