我目前正在尝试将 systemd 单元制作为 Web 服务器。目前,我的foo.service文件如下所示:
[Unit]
Description=The Foo Web Server
[Service]
Type=simple
ExecStart=/opt/foo/.cabal-sandbox/bin/foo
[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)
该foo可执行文件自动记录所有的HTTP请求到标准输出-这是很好的测试。但是,当我查看日志时journalctl -u foo,我只能得到这样的输出:
...
May 06 17:46:57 localhost systemd[1]: Stopping The Foo Web Server...
May 06 17:46:57 localhost systemd[1]: Started Foo Web Server.
May 06 17:46:57 localhost systemd[1]: Starting The Foo Web Server...
May 06 17:47:08 localhost systemd[1]: Stopping The Foo Web Server...
May 06 17:47:08 localhost systemd[1]: Started The Foo Web Server.
May 06 17:47:08 localhost systemd[1]: Starting …Run Code Online (Sandbox Code Playgroud) 我有一个启动脚本行:
pyprogramm >> /dev/null 2>&1 &
Run Code Online (Sandbox Code Playgroud)
含义:
>> /dev/null - redirect stdout to null device
2>&1 - redirect stderr to stdout (that is redirected to null device)
Run Code Online (Sandbox Code Playgroud)
但最后一个&是什么意思?
我在启动应用程序中的某些命令在我登录时无法正常启动。(特别是我在使用 gtk-redshift 时遇到了问题。)为了调试,我希望能够查看 stdout/stderr。我还没有找到启动应用程序的日志文件。我尝试使用“>> log.txt”重定向到一个文件,但没有成功。
如何查看启动应用程序的 stdout/stderr?更好的是,是否有启动应用程序的日志文件?
我无法弄清楚要StandardOutput=为单元文件 ( .service)传递什么选项,我想在连接的终端上从服务启动的位置显示一些消息!( console/tty好像不是我想要的)
也许可以更改/etc/systemd/system.conf全局默认值DefaultStandardOutput=journal,但我不想这样做!我只对显示我的单元文件中的一些进度/启动消息感兴趣(例如systemd-run -P)
我在 Ubuntu 18.04.2
# systemd --version
systemd 237
Run Code Online (Sandbox Code Playgroud) 为了验证是否安装了 docker gpg 密钥,我运行了:
sudo apt-key fingerprint 0EBFCD88 | grep "9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88"
Run Code Online (Sandbox Code Playgroud)
这导致了以下输出:
Warning: apt-key output should not be parsed (stdout is not a terminal)
9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88
Run Code Online (Sandbox Code Playgroud)
我发现了这个关于如何规避警告的Stack Overflow 问题,但我找不到任何关于它为什么首先出现的来源?你不应该解析apt-key输出的原因是什么?
我正在使用 lolcat 来获取 ls 的彩色输出。为此,我已将 /usr/bin/ls 复制到 /usr/bin/lsslss(以避免由于别名无法接受 $* 或 $@ 而导致无限循环),并且我添加了该函数:
ls(){ lsslss $* | lolcat; }
到 .bashrc
问题是,当我使用 ls 时,管道一次通过管道传输每个文件,因此它显示为一个长列表,如下所示:
而不是这样的表:
要将其更改为表,我可以将输出通过管道传输到列命令中。但是当我这样做时,它又变回了一个长列表(可能是因为列只对其进行格式化而不是将其更改为行)
我原本打算这样做:
ls(){ lsslss $* | columns | lolcat; }
无论如何,我想知道有没有办法通过管道传输原始输出而不是使用 | 能够将列的输出通过管道传输到 lolcat 中?
提前致谢。抱歉,如果我的问题措辞不当或难以理解。我几乎总能找到已经问过的问题,所以我不经常发布问题。
我需要将我正在运行的命令的输出重定向到带有时间戳的日志文件(因此是一个函数而不是日志文件本身),但错误和输出都不应该显示在控制台中。下列 -
command | my_func 2> /dev/null
Run Code Online (Sandbox Code Playgroud)
不管用。
就像是
command 2> logfile
Run Code Online (Sandbox Code Playgroud)
有效,但我无法在第二种情况下记录时间戳。我该怎么办?
我有一个 perl 脚本:
warn "1\n";
print "2\n";
warn "3\n";
print "4\n";
Run Code Online (Sandbox Code Playgroud)
我将输出通过管道传输到文件:
perl script.pl &> foo
Run Code Online (Sandbox Code Playgroud)
猫福:
1
3
2
4
Run Code Online (Sandbox Code Playgroud)
为什么输出不按顺序,我该如何解决?
我正在尝试制作一个看门狗 bash 脚本,它必须根据退出状态检查端口是否打开,否则应该启动守护程序。问题是我无法通过重定向 STDOUT 和 STDERR 来避免脚本输出任何信息。
nc -zv 1.2.3.4 55 | grep " open " >/dev/null 2>&1
Run Code Online (Sandbox Code Playgroud)
或者
nc -zv 1.2.3.4 55 | grep " open " 2>&1 >/dev/null
Run Code Online (Sandbox Code Playgroud)
或者
nc -zv 1.2.3.4 55 | grep " open " &>/dev/null
Run Code Online (Sandbox Code Playgroud)
反正回来
'FQDN_hostname_or_domainname [1.2.3.4] 55 (?) open'
Run Code Online (Sandbox Code Playgroud)
不过,此组合可与其他命令一起使用,例如netstat. 是关于 netcat 的,还是关于 bash 语法的?请让我知道我出了什么问题。
似乎read没有写入标准输出。
$ cat test.sh #!/bin/bash read -p “输入一个键并回车”键 echo "密钥是 $key" $ ./test.sh 键入一个键和 Enterx 关键是 x $ ./test.sh | 三通文件 键入一个键和 Enterx 关键是 x $猫文件 关键是 x
在没有脚本的情况下尝试...
$ read -p "键入一个键并回车" key | 三通文件 键入一个键和 Enterx $猫文件 $
此处read描述了该命令。简要说明:“从标准输入中读取一行”。
有关管道的信息|,来自William E. Shotts 的The Linux Command Line (2nd Internet Edition)。
使用管道运算符“|” (竖线),一个命令的标准输出可以通过管道传输到另一个命令的标准输入:
command1 | command2
从手册页tee是这样的描述:
从标准输入读取并写入标准输出和文件
的手册页tee位于此链接。
写入控制台但实际上不使用标准输出的程序的所有其他示例的列表在哪里,或者在没有这样的列表的情况下,知道何时写入控制台的程序不使用的一般规则是什么?使用标准输出?
这似乎read违反了最小惊讶原则 …
我想git clone使用
git clone https://github.com/someRepository > git_clone.file
Run Code Online (Sandbox Code Playgroud)
但相反,我在终端中显示/更新了输出,例如
Cloning to 'someRepository' ...
remote: Counting objects: 2618, done.
remote: Compressing objects: 100% (14/14), done.
remote: Total 2618 (delta 2), reused 12 (delta 1), pack-reused 2603
Received objects: 100% (2618/2618), 258.95 MiB | 4.39 MiB/s, Done.
Resolving Differences auf: 100% (1058/1058), Done.
Check Connectivity ... Done.
Run Code Online (Sandbox Code Playgroud)
但文件git_clone.file已生成但仍为空。
我最初的目标是绕过输出git到函数中(请参阅我的问题here)。但是现在我意识到git甚至似乎没有产生stdout真正但不知何故不同的输出,因为没有任何内容写入文件。
如何从中获取此显示的输出git以将其重定向到文件/函数?
编辑
建议的stderr(and stdout)重定向没有解决问题。
git clone https://github.com/someRepository …Run Code Online (Sandbox Code Playgroud) 有人能告诉我是否可以直接压缩标准输出?
我想在不创建临时文件 files.txt 的情况下一步完成此操作...
例子:
cat file* > files.txt
tar -czf files.tar files.txt
rm files.txt
Run Code Online (Sandbox Code Playgroud)
这可能吗?