如何查看 ansible-playbook 命令的标准输出?-v 只显示 ansible 输出,而不是单个命令。如果我能立即弄清楚如何执行此操作,那就太好了,因此如果出现故障或挂起,我可以了解原因。
例如
- name: print to stdout
action: command echo "hello"
Run Code Online (Sandbox Code Playgroud)
会打印
TASK: [print variable] ********************************************************
hello
Run Code Online (Sandbox Code Playgroud) 我有一个长时间运行的批处理进程,它将一些调试和进程信息输出到标准输出。如果我只是从终端运行,我可以跟踪“它在哪里”,但是数据会变得太多并从屏幕上滚动。
如果我重定向到输出到文件 '> out.txt' 我最终会得到整个输出,但它被缓冲了,所以我现在看不到它在做什么。
有没有办法重定向输出但使其不缓冲其写入?
我有一个正在运行的命令会产生大量输出,我想在不写入文件的情况下使输出静音。我使用以下内容将所有输出发送到文件,但我又不想要任何文件输出:
command > out.txt 2>&1
Run Code Online (Sandbox Code Playgroud)
我以前command > /dev/null
在我的 CentOS 机器上使用过,但我在 Windows 上找不到类似的东西。
我想从 lftp 访问进度信息。目前,我正在使用 curl ,如下所示:
curl http://example.com/file -o file -L 2> download.log
Run Code Online (Sandbox Code Playgroud)
这会将 curl 的进度信息写入 download.log 文件,我可以通过拖尾获取实时进度。
但是同样的方法不适用于 lftp,无论是 stdout 还是 stderr。我最终得到一个空的 download.log 文件,直到传输完成。
lftp -e 'get http://example.com/file;quit' 2> download.log
lftp -e 'get http://example.com/file;quit' 1> download.log
Run Code Online (Sandbox Code Playgroud)
当我不重定向输出时,我会在屏幕上看到进度。当我重定向输出时,我不再在屏幕上看到进度,但在 download.log 中没有显示任何内容。文件传输完成后,我看到了最终结果,就像这样 - 但之前什么都没有:
97618627 bytes transferred in 104 seconds (913.1K/s)
Run Code Online (Sandbox Code Playgroud)
lftp 是否对其输出做了一些不寻常的事情 - 打印到屏幕而不打印到 stdout/stderr?除了重定向 stdout/stderr 之外,还有其他捕获屏幕输出的方法吗?
我正在尝试以静默方式自动复制一些文件。现在,我有 robocopy 将所有内容放入日志文件中,这很好,但完成后Log File: C:\<logfiledestination>
会打印出来。我的命令如下所示:
robocopy source destination /mir /xd .svn /log:log.txt /np >nul 2>&1
.
从网上搜索,我认为这>nul 2>&1
会阻止任何东西出现。我对 Windows 命令行非常陌生,所以如果我做错了什么,请告诉我!
编辑:我在那里有一个幻影的半句我错过了。不过现在修好了。
作为持续交付管道的一部分,我想在给定的机器上安装 msi。msiexec plus psexec 完美地做到了这一点,但似乎 msiexec 只能登录到一个文件,而我需要它登录到 stdout/stderr。
现在,为了将输出返回到我们的 CI 软件中,我必须添加第二个步骤来回显日志的内容,这似乎有点毫无意义。
有没有人以前遇到过这个问题(并克服了它?)
在此先感谢您的帮助。
标记
(在 Ubuntu 10.04 64 位服务器上运行)
昨天,我犯了一个错误,即在没有使用 screen 的情况下通过 SSH 启动一个进程(我没有意识到这需要几天的时间才能运行)。我今天花了一整天的时间试图找出某种方法,我可以从 SSH 的铁腕中撬出进程的输出,以便我可以重新启动我的客户端机器,但没有任何进展。
我尝试使用 gdb 并按照本页底部的说明进行操作,但是当我运行第一个 gdb 命令来创建文件时,我收到一条错误消息,指出No symbol table is loaded. Use the "file" command.
根据我收集的内容,这意味着我必须重新编译其输出的程序我正在尝试重定向,这当然对我来说绝对没有帮助,因为它已经在运行。
我还认为我可以使用 retty 将输出重定向到另一个终端,但显然它不能在 64 位平台上编译。
如何将此进程的输出重定向到另一个终端或文件?
通常日志消息写入 stderr。我想知道拆分日志消息是否是一个好主意/实践,以便错误和警告转到标准错误,而调试/信息/通知消息转到标准输出?或者这是否无关紧要,因为许多专用日志记录进程无论如何只能从 stdin 读取,这需要将 stderr 和 stdout 中的源日志消息组合起来并重定向到记录器的 stdin。
[更新]
下面的两个答案都提到了系统日志,我想我需要详细说明设置。
我询问的守护进程自己在前台运行。守护进程由监督进程管理,例如runit
或supervisord
。在这两种情况下,守护进程的 stderr 和 stdout 将被监督进程捕获,并且监督进程的工作是决定如何以及在哪里存储日志(可能是系统日志,或者通过 UDP 网络中的其他地方) . 守护进程不必担心写入日志的内容和位置,因为它们只是写入 stdout/stderr。
在 的情况下runit
,其日志记录工具svlogd
将从其 stdin 中读取重定向的日志消息,这些消息是托管守护进程的 stderr/stdout 组合。至于supervisord
,它可以记录 stderr 和 stdout 以分隔日志文件。
因此,在这种特定设置中,在 stderr 和 stdout 之间拆分日志还是仅写入其中一个是一种好习惯?
使用时
CMD ["/usr/sbin/sshd", "-D"]
Run Code Online (Sandbox Code Playgroud)
在 Dockerfile 中,docker logs
不显示日志记录:
cat > Dockerfile.stdout <<EOF
FROM alpine:latest
RUN apk add --no-cache openssh-server \
&& mkdir /var/run/sshd \
&& ssh-keygen -A
CMD ["/usr/sbin/sshd", "-D"]
EOF
docker build -f Dockerfile.stdout -t sshd-stdout .
docker run --name sshd-stdout -d sshd-stdout
docker logs sshd-stdout
<empty>
Run Code Online (Sandbox Code Playgroud)
Docker主机是CentOS:
cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
Run Code Online (Sandbox Code Playgroud)
Docker 日志记录后端是日志记录:
grep ^OPTIONS /etc/sysconfig/docker
OPTIONS='--selinux-enabled --log-driver=journald --signature-verification=false'
Run Code Online (Sandbox Code Playgroud)
我也尝试使用 json 作为日志记录后端,但没有成功。
如何正确“转发”日志记录?
正如@marioavs 所建议的,“-e”是必要的。我尝试过“-e”和“-D”,但不同时尝试。所以:
cat > Dockerfile.stdout <<EOF
FROM alpine:latest
RUN apk …
Run Code Online (Sandbox Code Playgroud) 当我手动运行该服务时,它会在启动时记录一些内容。
但当它作为 systemd 进程启动时,我无法在任何地方找到该日志。
journalctl -u <service>
只显示服务启动和停止的记录,不显示实际的服务输出。
我尝试将配置添加到/etc/systemd/system/<service>.service
文件中:
StandardOutput=append:/var/opt/<service>/stdout.log
StandardError=append:/var/opt/<service>/stderr.log
Run Code Online (Sandbox Code Playgroud)
但这也没有帮助 - 文件是在守护进程和服务重新启动后创建的,但它们是空的。
我缺少什么?
感谢您的任何建议,我没有想法。