让我们假设我们有一个用python编写的这样一个简单的守护进程:
def mainloop():
while True:
# 1. do
# 2. some
# 3. important
# 4. job
# 5. sleep
mainloop()
Run Code Online (Sandbox Code Playgroud)
然后我们使用start-stop-daemon默认的send SIGTERM(TERM)信号进行守护--stop.
我们假设当前执行的步骤是#2.在这个时刻,我们正在发送TERM信号.
会发生什么是执行立即终止.
我发现我可以处理信号事件,signal.signal(signal.SIGTERM, handler)但问题是它仍然会中断当前执行并将控制传递给handler.
所以,我的问题是-它可以不中断当前执行,但处理TERM(?)在独立的线程信号,使我能够设置shutdown_flag = True,使mainloop()有机会停止正常?
我使用init脚本来运行一个简单的进程,该进程以:
start-stop-daemon --start --quiet --chuid $DAEMONUSER \
--make-pidfile --pidfile $PIDFILE --background \
--exec $DAEMON $DAEMON_ARGS
Run Code Online (Sandbox Code Playgroud)
名为$ DAEMON的进程通常将日志信息打印到其标准输出.据我所知,这些数据没有存储在任何地方.
我想将$ DAEMON的stdout写入或附加到某个文件中.
我知道的唯一解决方案是告诉start-stop-daemon直接调用一个shellscript而不是$ DAEMON; 然后脚本调用$ DAEMON并写入日志文件.但这需要一个额外的脚本,就像修改守护进程本身一样,似乎是解决这种常见任务的错误方法.
什么是start-stop-daemon以及如何使用它?
我正在尝试自动运行特定程序.只要系统启动,程序就应该运行.为此,我正在编写脚本/etc/init.d/.
以前的JBoss版本包含一个脚本(如jboss_init_redhat.sh),可以复制到/etc/init.d以便将其添加为服务 - 因此它将在启动时启动.我似乎无法在JBoss 7中找到任何类似的脚本.有没有人已经做过这样的事情?
PS我试图在Ubuntu 10.04中实现这一点
我是rails世界的新手,需要在守护进程模式下运行我的rails测试服务器.
我注意到有一个-d标志,但它不适合我..
rails -s -d
Run Code Online (Sandbox Code Playgroud)
不应该这样吗?
我正在尝试使用start-stop-daemon启动python脚本:
sudo /sbin/start-stop-daemon --start --pidfile /home/loop.pid \
--user www-data --group www-data -b --make-pidfile --chuid www-data \
--exec /usr/bin/python /home/loop.py --verbose
Run Code Online (Sandbox Code Playgroud)
但我的进程中没有python脚本.我做错了什么?
loop.py:
import time
while True:
print "working..."
time.sleep(3)
Run Code Online (Sandbox Code Playgroud) 我有以下开始 - 停止脚本:
NAME="examplestartstop"
PATH="/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/node/bin"
LOGFILE="/var/log/$NAME/start-stop-daemon.log"
APP_DIR="/usr/bin"
APP_BIN="tail -250f /var/log/apache2/error.log"
USER="minecraft"
GROUP="minecraft"
# Include functions
set -e
. /lib/lsb/init-functions
start() {
echo "Starting '$NAME'... "
start-stop-daemon --start --chuid "$USER:$GROUP" --background --make-pidfile --pidfile /var/run/$NAME.pid --exec "$APP_DIR/$APP_BIN" $LOGFILE || true
echo "done"
}
Run Code Online (Sandbox Code Playgroud)
当我尝试运行脚本时,我得到以下输出:
$ ./test start
Starting 'examplestartstop'...
start-stop-daemon: unable to stat /usr/bin/tail -250f /var/log/apache2/error.log (No such file or directory)
done
Run Code Online (Sandbox Code Playgroud)
我做错了$APP_DIR/$APP_BIN什么?
我有一点时间使用start-stop-daemon在java脚本中正确启动java程序.我已经编写了init脚本,它似乎运行但是之后从来没有一个进程表示正在运行的程序.
这是我的init脚本的片段
#! /bin/sh
#
#
DAEMON="/usr/bin/java"
DAEMON_ARGS="-server -cp <bunch of RMI arguments and classpath stuff> -jar <absolute path>/myprog.jar"
PIDFILE="/var/run/myprog.pid"
case "$1" in
start)
echo -n "Starting myprog"
start-stop-daemon --start --pidfile "$PIDFILE" --chuid "myuser" --verbose --background --make-pidfile --startas "$DAEMON" -- $DAEMON_ARGS
echo "."
;;
Run Code Online (Sandbox Code Playgroud)
当我尝试通过/etc/init.d启动它时,我得到以下内容:
/etc/init.d# /etc/init.d/myscript start
启动myprogStarting/usr/bin/java ...
重启以启动/usr/bin/java..done.
.
之后,没有运行java解释器进程,执行myprog.jar
我已经尝试了--exec, - start的各种组合,或多或少相同的结果.如果我能更清楚地了解正在发生的事情,我相信我可以解决这个问题,但我不确定如何做到这一点.
有什么建议?
(我在嵌入式ARM平台上运行Angstrom,因此Java Service Wrapper实际上不是一个可行的选择,即我认为它不适用于ARM)
我被困了所以任何建议都会非常感激.
谢谢.
我们有一个多线程Spring Boot应用程序,它在Linux机器上作为守护进程运行.当我尝试通过这样的start-stop-daemon停止应用程序时
start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME
Run Code Online (Sandbox Code Playgroud)
发送SIGTERM信号,应用程序即将结束.但是我希望应用程序等待,直到每个线程完成它的工作.
有没有办法,如何管理收到SIGTERM信号时会发生什么?
此命令是upstart脚本的一部分,该脚本曾用于ubuntu 12.04,10.04.
sudo start-stop-daemon --start --make-pidfile --pidfile /var/run/mk_order_handler.pid --chuid ubuntu --exec /data2/src/jeapps/sites/crons_index.php workers/mk_order_handler
我刚刚将系统升级到14.04并且upstart脚本停止工作.当我手动执行start-stop-daemon命令时,我得到了Exec format error.
我能看到的唯一区别是,脚本放在一个单独的块设备中.它会引起问题吗?我怎么能修复这个错误?