我在启动 Java 应用程序的自定义初始化脚本的 do_start() 中有以下行:
start-stop-daemon --background --start --quiet --oknodo --make-pidfile --pidfile $PIDFILE --chdir $SOLR_DIR --chuid $USER --exec $DAEMON -- \
$DAEMON_ARGS >>$LOG_DIR/$NAME.log 2>>$LOG_DIR/$NAME.err
展开后变为:
start-stop-daemon --background --start --quiet --oknodo --make-pidfile --pidfile /var/run/solr.pid
--chdir /home/phuihock/src/proj/solr
--chuid phuihock
--exec /usr/bin/java
-- -jar start.jar >>/home/phuihock/src/proj/logs/solr.log 2>>/home/phuihock/src/proj/logs/solr.err
创建的日志文件归 root 用户、root 组所有。我期望它们归我用 --chuid 设置的用户所有,因为从手册页来看,-- 之后的所有内容均未经修改地传递。
我的问题是,start-stop-daemon 的所有重定向是否都归 root 所有,有没有办法改变这一点?
答案1
重定向不是命令行参数的一部分。它们由 shell 单独处理,在您的情况下,shell 以 root 身份运行。但即使权限正确,此命令也不会导致守护进程的输出附加到日志文件。
为了说明起见,以下是实际发生的情况:
- shell 执行 start-stop-daemon 并将其输出重定向到 solr.log。该文件将为空,因为此命令不输出任何内容(只需尝试手动运行它,而不进行重定向)。
- start-stop-daemon 命令处理其参数并最终调用
/usr/bin/java -jar start.jar
。请注意,这里没有输出重定向,但进程在后台分叉,因此输出最终位于 /dev/null 中。
换句话说,守护进程应该接受日志文件参数,或者您需要创建一个包装器脚本来处理重定向。它可能如下所示
#/bin/sh
cd /home/phuihock/src/proj/solr
exec /usr/bin/java -jar start.jar >> logs/solr.log