关于这一点已经有几个问题了,但似乎都不起作用。我有一个当前停机的生产系统,我需要能够快速地从守护进程获得stderr输出,以便对其进行调试。
我以为我可以从(在init.d脚本中)调用的地方重定向输出,但事实证明这非常困难。
start-stop-daemon -d $DDIR -b -m --start --quiet -pidfile $PIDFILE --exec $DAEMON -- \
$DAEMON_ARGS > /var/log/daemon.log 2>&1 \
|| return 2这不起作用。我尝试运行一个调用可执行文件并重定向输出的shell脚本,但是日志文件仍然是空的(并且我确实知道该进程正在输出信息)。
任何帮助都将不胜感激。
发布于 2016-11-24 22:13:53
如果您使用的是start-stop-daemon >=版本1.16.5,那么只需使用--no-close调用它,就可以重定向已启动进程的输出。
来自man start-stop-daemon
-C,--不关闭
强制后台守护程序进入后台时,不要关闭任何文件描述符(从1.16.5版开始)。用于调试目的,以查看进程输出,或重定向文件描述符以记录进程输出。只有在使用--backacking.时才相关
发布于 2012-10-09 03:10:51
据我所知,这是不可能的,通常当我需要从守护进程获取数据时,我会事先记录数据,或者创建一个监控程序,通过网络套接字或命名管道或任何其他进程间通信机制连接到该程序。
发布于 2013-11-20 07:13:02
使用> /var/log/daemon.log 2>&1调用启动-停止-守护程序将重定向启动-停止-守护程序的输出和,而不是已启动的守护程序的输出。Start-stop-daemon将在运行守护程序之前关闭标准输出/输入描述符。
将可执行文件包装在一个简单的shell脚本中,如下所示:
#!/bin/bash
STDERR=$1
shift
DAEMON=$1
shift
$DAEMON 2>$STDERR $*适用于我-也许你应该检查文件权限?
这个简单的解决方案有一个问题--当start-stop-daemon杀死这个包装器时,被包装的守护进程将保持活动状态。这在bash中很难解决,因为您不能在脚本执行期间运行信号处理程序(有关详细信息,请参阅trap文档)。您必须编写一个C包装器,如下所示:
#include <fcntl.h>
#include <unistd.h>
int main(int argc, char** argv){
int fd_err;
fd_err = open(argv[1], O_WRONLY | O_CREAT | O_TRUNC);
dup2(fd_err, STDERR_FILENO);
close(fd_err);
return execvp(argv[2], argv + 2);
}(为了清楚起见,我省略了错误检查)。
https://stackoverflow.com/questions/12787768
复制相似问题