设置由 start-stop-daemon 输出重定向创建的文件的所有者

设置由 start-stop-daemon 输出重定向创建的文件的所有者

我在启动 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 身份运行。但即使权限正确,此命令也不会导致守护进程的输出附加到日志文件。

为了说明起见,以下是实际发生的情况:

  1. shell 执行 start-stop-daemon 并将其输出重定向到 solr.log。该文件将为空,因为此命令不输出任何内容(只需尝试手动运行它,而不进行重定向)。
  2. 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

相关内容