标签: stdout

如何记录start-stop-daemon启动的进程的stdout?

我使用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并写入日志文件.但这需要一个额外的脚本,就像修改守护进程本身一样,似乎是解决这种常见任务的错误方法.

logging stdout init.d start-stop-daemon

115
推荐指数
6
解决办法
9万
查看次数

管道到三通时强制线缓冲标准输出

通常,stdout是行缓冲的.换句话说,只要您的printf参数以换行符结尾,您就可以立即打印该行.使用管道重定向时,这似乎不成立tee.

我有一个C++程序,a它输出字符串,总是被\n终止stdout.

当它由它自己运行时(./a),所有内容都在正确的时间正确打印,正如预期的那样.但是,如果我将它传递给tee(./a | tee output.txt),它会在它退出之前不会打印任何内容,这会使使用的目的失效tee.

我知道我可以通过fflush(stdout)在C++程序中的每次打印操作之后添加一个来修复它.但是有更清洁,更简单的方法吗?例如,是否有一个命令可以运行stdout,即使使用管道也会强行进行行缓冲?

unix buffer stdout pipe tee

103
推荐指数
5
解决办法
5万
查看次数

在Go中重定向子进程的stdout管道

我正在Go中编写一个程序来执行类似程序的服务器(也是Go).现在我想在我启动父程序的终端窗口中输入子程序的标准输出.一种方法是使用该cmd.Output()函数,但只有在进程退出后才打印stdout.(这是一个问题,因为这个类似服务器的程序运行了很长时间,我想读取日志输出)

变量out是,type io.ReadCloser我不知道我应该怎么做才能完成我的任务,我在网上找不到任何有用的信息.

func main() {
    cmd := exec.Command("/path/to/my/child/program")
    out, err := cmd.StdoutPipe()
    if err != nil {
        fmt.Println(err)
    }
    err = cmd.Start()
    if err != nil {
        fmt.Println(err)
    }
    //fmt.Println(out)
    cmd.Wait()
} 
Run Code Online (Sandbox Code Playgroud)

代码说明:取消注释Println函数以获取编译代码,我知道这Println(out io.ReadCloser)不是一个有意义的函数.
(它产生输出&{3 |0 <nil> 0})这两行只是获取编译代码所必需的.

stdout command-line-interface go

99
推荐指数
3
解决办法
4万
查看次数

如何从Python函数调用中捕获stdout输出?

我正在使用一个对象做某事的Python库

do_something(my_object)
Run Code Online (Sandbox Code Playgroud)

并改变它.这样做时,它会向stdout打印一些统计信息,我想抓住这些信息.适当的解决方案是改变do_something()以返回相关信息,

out = do_something(my_object)
Run Code Online (Sandbox Code Playgroud)

但在开始讨论do_something()这个问题之前还需要一段时间.作为一种解决方法,我考虑解析do_something()对stdout的任何写入.

如何在代码中的两点之间捕获stdout输出,例如,

start_capturing()
do_something(my_object)
out = end_capturing()
Run Code Online (Sandbox Code Playgroud)

python stdout capture

93
推荐指数
2
解决办法
5万
查看次数

Ruby中$ stdout和STDOUT之间的区别

在Ruby中,$stdout(以美元符号开头)和STDOUT(在所有大写字母中)之间有什么区别?在进行输出重定向时,应该使用哪个以及为什么?这同样适用于$stderrSTDERR.

编辑:刚刚找到一个相关的问题.

ruby stdout stderr output-redirect

87
推荐指数
3
解决办法
3万
查看次数

在Ruby中连续读取外部进程的STDOUT

我想通过ruby脚本从命令行运行blender,然后逐行处理blender给出的输出以更新GUI中的进度条.混合器是我需要读取的stdout的外部进程并不重要.

当blender进程仍在运行时,我似乎无法捕获blender正常打印到shell的进度消息,并且我尝试了几种方法.搅拌机退出后,我似乎总是访问搅拌机的标准配置,而不是在它仍在运行时.

这是尝试失败的一个例子.它确实得到并打印了搅拌机输出的前25行,但只有在搅拌机过程退出后:

blender = nil
t = Thread.new do
  blender = open "| blender -b mball.blend -o //renders/ -F JPEG -x 1 -f 1"
end
puts "Blender is doing its job now..."
25.times { puts blender.gets}
Run Code Online (Sandbox Code Playgroud)

编辑:

为了使它更清晰一点,调用blender的命令会在shell中返回一个输出流,指示进度(第1-16部分已完成等).似乎任何"获取"输出的调用都会被阻止,直到混合器退出为止.问题是如何在blender仍在运行时访问此输出,因为blender将其输出打印到shell.

ruby shell stdin stdout process

84
推荐指数
3
解决办法
3万
查看次数

从Python中的脚本捕获stdout

假设有一个脚本做这样的事情:

# module writer.py
import sys

def write():
    sys.stdout.write("foobar")
Run Code Online (Sandbox Code Playgroud)

现在假设我想捕获write函数的输出并将其存储在变量中以供进一步处理.天真的解决方案是:

# module mymodule.py
from writer import write

out = write()
print out.upper()
Run Code Online (Sandbox Code Playgroud)

但这不起作用.我想出了另一个解决方案并且它有效,但是请告诉我是否有更好的方法来解决问题.谢谢

import sys
from cStringIO import StringIO

# setup the environment
backup = sys.stdout

# ####
sys.stdout = StringIO()     # capture output
write()
out = sys.stdout.getvalue() # release output
# ####

sys.stdout.close()  # close the stream 
sys.stdout = backup # restore original stdout

print out.upper()   # post processing
Run Code Online (Sandbox Code Playgroud)

python stdout sys

79
推荐指数
8
解决办法
8万
查看次数

Python:运行os.system后如何获取stdout?

我希望stdout在运行os.system调用后获取变量.

让我们以此行为例:

batcmd="dir"
result = os.system(batcmd)
Run Code Online (Sandbox Code Playgroud)

result将包含错误代码(stderr 0在Windows下或1在某些linux下用于上面的示例).

如何stdout在执行的命令中不使用重定向来获取上述命令?

python os.system stdout stderr python-2.7

79
推荐指数
6
解决办法
16万
查看次数

从子进程实时捕获stdout

我想subprocess.Popen()在Windows中使用rsync.exe,并在Python中打印stdout.

我的代码有效,但在文件传输完成之前它没有抓住进度!我想实时打印每个文件的进度.

现在使用Python 3.1,因为我听说它应该更好地处理IO.

import subprocess, time, os, sys

cmd = "rsync.exe -vaz -P source/ dest/"
p, line = True, 'start'


p = subprocess.Popen(cmd,
                     shell=True,
                     bufsize=64,
                     stdin=subprocess.PIPE,
                     stderr=subprocess.PIPE,
                     stdout=subprocess.PIPE)

for line in p.stdout:
    print(">>> " + str(line.rstrip()))
    p.stdout.flush()
Run Code Online (Sandbox Code Playgroud)

python subprocess stdout

74
推荐指数
9
解决办法
10万
查看次数

在Linux上使用Bash将所有输出重定向到文件?

我试图将命令行程序的所有输出重定向到文件.我正在使用Bash.一些输出被定向到文件,但是一些仍然出现在终端中并且不存储到文件中.

这里描述了类似的症状:

将所有输出重定向到文件

但是我尝试了所提出的解决方案(捕获stderr)但没有成功:

<cmd> <args> > stdout.txt 2> stderr.txt
Run Code Online (Sandbox Code Playgroud)

文件stderr.txt已创建但为空.

可能的线索是命令行程序是与同一台机器上的服务器通信的客户端.可能有些输出来自服务器.

有没有办法捕获终端的所有输出,无论其来源如何?

编辑:

我已经确认缺少的输出是由服务器生成的.在单独的终端中运行命令会在两个终端中产生一些输出,我可以将命令终端的所有输出传输到文件.这引发了有关如何捕获服务器输出的问题,但这是一个不同的问题.

linux bash stdout stderr

71
推荐指数
5
解决办法
11万
查看次数