我想查看实时shell标准输出,而不是register在变量中输入,然后在完成后显示。
示例剧本 - test.yml
- name: Testing RUN Shell Command
hosts: localhost
connection: local
tasks:
- name: Runnig Update
shell: apt update
Run Code Online (Sandbox Code Playgroud)
默认输出
$ ansible-playbook test.yml
PLAY [Testing RUN Shell Command] ******************************************************************************************************
TASK [Gathering Facts] ****************************************************************************************************************
ok: [localhost]
TASK [Runnig Update] ******************************************************************************************************************
changed: [localhost]
PLAY RECAP ****************************************************************************************************************************
localhost : ok=2 changed=1 unreachable=0 failed=0
Run Code Online (Sandbox Code Playgroud)
但是我想看看当我们运行apt update终端时它在做什么
$ sudo apt update
Ign:1 http://dl.google.com/linux/chrome/deb stable InRelease
Hit:2 http://dl.google.com/linux/chrome/deb stable Release
Hit:3 http://ppa.launchpad.net/brightbox/ruby-ng/ubuntu bionic InRelease
Get:4 http://security.ubuntu.com/ubuntu bionic-security …Run Code Online (Sandbox Code Playgroud) 有人可以向我解释一下下面的 cron 作业中“2>&1”的含义是什么吗
0 23 * * * wget -q -O /dev/null "https://example.com/index.php" > /dev/null 2>&1
Run Code Online (Sandbox Code Playgroud) 我在 Ubuntu 上。
是否可以在终端中打开 putty 并观察日志文件的更新?就像标准输出是否会被定向到终端一样?
例如,我将一个应用程序的 stdout 和 stderr 定向到一个文件中,并且想查看我的应用程序如何从另一个终端启动。
这可能是以最简单的形式提出问题的最佳场所。我正在编写一个脚本,它获取命令的输出并将其放入变量中。经过一些调试后,我找出了错误时的命令,它没有转到标准输出而是转到控制台(或墙)。请参阅下面的示例:
命令运行成功时
root@local# apcaccess status
APC : 700
VERSION : xxxxx
BATTSTAT : AC
Run Code Online (Sandbox Code Playgroud)
当命令出错时
root@local# apcaccess status
apcupsd @ localhost: Connection Refused.
root@local# apcaccess status | grep -i version
apcupsd @ localhost: Connection Refused.
Run Code Online (Sandbox Code Playgroud)
我注意到当我尝试通过 grep 'apcaccess status | 管道命令时 grep -i version' 我会在成功运行时获得版本号,但在系统上它会出错,我会收到错误消息。我相信它不会通过标准输出。
问题是:如何强制输出转到标准输出?
简单地说,我怎样才能让 GPG 不打印该消息?以下是我正在使用的命令:
echo "test input" > test.in
echo "test" | gpg -q -c --passphrase-fd 0 --output test.enc --yes --force-mdc test.in
echo "test" | gpg -q -d --passphrase-fd 0 test.enc > test.out
Run Code Online (Sandbox Code Playgroud)
并运行它:
$ echo "test input" > test.in
$ echo "test" | gpg -q -c --passphrase-fd 0 --output test.enc --yes --force-mdc test.in
Reading passphrase from file descriptor 0
$ echo "test" | gpg -q -d --passphrase-fd 0 test.enc > test.out
Reading passphrase from file descriptor 0
Run Code Online (Sandbox Code Playgroud)
编辑:重定向 stderr …
我正在运行以下命令:
[user@server ~]$ /usr/sbin/ntpdate -d IPREMOVEDFORSECURITY | egrep 'transmit timestamp' | tail -1 | awk '{print $4, $5, $6, $7, $8}'
host found : HOSTREMOVEDFORSECURITY
Tue, Feb 15 2011 12:38:38.321
Run Code Online (Sandbox Code Playgroud)
所以问题是,无论我使用哪种类型的重定向,我总是得到“找到主机:”行。我尝试了以下方法:
0>/dev/null
1>/dev/null
2>/dev/null
2>&1
2>&/dev/null
Run Code Online (Sandbox Code Playgroud)
以及我能想到的或能够在网上找到的所有其他变体。我需要并希望返回的是该命令输出的第二行(时间戳)。我不明白为什么我似乎无法影响“主机找到:”行?!?!
我通过 perl 运行这些命令,但是在 bash 中直接运行它们时我看到了相同的行为。我需要抑制该 host: 行,因为在 perl 中,我使用反引号运行命令将输出分配给变量,并根据其他一些条件输出干净的响应。无论如何,该主机行显示并混淆了我的脚本输出,尽管它不会影响实际分配给变量的内容。
我的假设是这条线没有使用普通的 STDIN、STDOUT、STDERR 线程,但我似乎无法确定关于第 4 种输出方法的任何特定信息。我发现的每个网站都只谈论这三个。
如果有人对此有答案,请告诉我!
PS:这不是显示此行为的唯一命令,chkconfig 和其他一些命令也执行此操作,我真的很想弄清楚如何抑制这种不必要的输出。
在 linux/bash 上,我想将命令的 stdout 附加到文件,但不重定向它(即我希望它同时转到控制台和文件)。有什么线索吗?
我正在制作一个在内部执行一些命令的脚本,这些命令显示一些输出STDOUT(STDERR以及,但这没问题)。我需要我的脚本生成一个 .tar.gz 文件到STDOUT,所以脚本中执行的一些命令的输出也会转到STDOUT,这以输出中无效的 .tar.gz 文件结束。
因此,简而言之,可以将第一个命令输出到屏幕(因为我仍然想看到输出)但不能通过STDOUT? 此外,我想保持STDERR原样,以便那里只显示错误消息。
我的意思的一个简单例子。这将是我的脚本:
#!/bin/bash
# the output of these commands shouldn't go to STDOUT, but still appear on screen
some_cmd foo bar
other_cmd baz
#the following command creates a tar.gz of the "whatever" folder,
#and outputs the result to STDOUT
tar zc whatever/
Run Code Online (Sandbox Code Playgroud)
我试过搞乱exec文件描述符,但我仍然无法让它工作:
#!/bin/bash
# save STDOUT to #3
exec 3>&1
# the output of these commands should go to …Run Code Online (Sandbox Code Playgroud) 这是一种常见情况:您希望将命令 'foo' 作为管道的一部分包含在内,但不幸的是,命令 'foo' 只接受 I/O 的实际文件名,并且不从 stdin/stdout 读/写。我知道有一个 Unix 命令可以作为诸如“foo”之类的错误命令的包装器,但我不记得它的名字。它是什么?
我很困惑为什么这不起作用。
我试过使用“&>”和“2>&1”重定向STDOUT和STDERR,但似乎都不起作用。我仍然收到这个 cron 作业(每分钟!)的电子邮件,smbclient 抱怨共享中没有文件。
* * * * * smbclient //scanner/scan-import secretpass -U administrator -c "prompt; mget *; del *" &> /dev/null
Run Code Online (Sandbox Code Playgroud)
好奇:客户有一台旧的、昂贵的扫描仪,可以高速扫描多个文档——但该软件无法配置保存位置。他们不想将文档直接保存在旧的 XP 工作站上,所以我已经共享了保存位置并使用此 cron 作业自动将文档拉到他们的 linux 服务器上。
我有用语言编写的应用程序Go并且它运行在screen
(我认为问题与Go语言无关。我相信它使用STDOUT和STDERR)
screen -S log_server -d -m go run log_server.go 2 > err3.txt 1 > std3.txt
Run Code Online (Sandbox Code Playgroud)
当它崩溃时,我在屏幕中写入错误,而不是在err3.txt或std3.txt
screen 不滚动并且不允许我阅读完整错误。
std3.txt工作正常
err3.txt,大小为 0 并打印错误screen(我可以看到最后 20 或 30 行)应用程序每 3 或 5 天崩溃一次。