【发布时间】:2016-04-27 13:15:59
【问题描述】:
我想修改和重定向所有正在运行的进程的输出。我知道如果我知道进程的名称,我可以做这样的事情
process 2>&1 >/dev/null
这会将 stderr 和 stdout 重定向到 dev/null。首先,在将标准输出发送到 dev/null 或其他任何地方之前,我将如何修改它?一种可能的解决方案是
process 2>&1 | awk '{print "$SOME_ENV_VAR|" $0;}' > dev/null
这是正确的方法吗?是否可以忍受 stdout 和 stderr 都被重定向?
如果我不想重定向到 dev/null,而是想打印到控制台怎么办?
更大的问题是,如何为每个正在运行的进程执行此操作?我需要在我不知道正在运行的进程名称的 linux 机器中执行此操作。这可行吗?
我对 shell 脚本还很陌生,所以请原谅我这些问题是微不足道的。
【问题讨论】:
-
首先,您应该说明您使用的是哪种外壳。对于 linux,您很可能正在使用 bash。然后,running processes 建议您尝试在启动进程之后修改 I/O 分配 - 这是不可能的(至少在没有特殊内核支持的情况下)。但是,您的示例建议您在进程开始时指定 I/O。最后,您应该详细说明您想要实现的目标。 sh(因此也是 bash)在 stin/stdout/stderr 的进程如何相互连接方面非常强大。
-
谢谢,我刚刚注意到
awk '{print "$SOME_ENV_VAR|" $0;}'没有覆盖环境变量。如何在 awk 中使用环境变量? -
这不是
awk的属性,而是您在awk脚本参数中使用单引号(') 的结果。它会插值,例如你确实使用过:awk '{print '"$SOME_ENV_VAR|"' $0;}'。但是,这只会在发送/dev/null之前将$SOME_ENV_VAR的值添加到process的每一行。 -
或者,您可以使用
-v切换到awk来分配变量。在您的情况下,例如:awk -v var="$SOME_ENV_VAR" '{ print var "|" $0;}' -
太棒了!谢谢你的作品