相关疑难解决方法(0)

关闭管道中的缓冲

我有一个调用两个命令的脚本:

long_running_command | print_progress
Run Code Online (Sandbox Code Playgroud)

long_running_command打印的进展,但我很不满意它。我正在使用print_progress使其更好(即,我在一行中打印进度)。

问题:将管道连接到标准输出也会激活一个 4K 缓冲区,所以漂亮的打印程序什么都没有……什么都没有……什么都没有……很多……:)

如何禁用4K缓冲区long_running_command(不,我没有源)?

shell pipe buffer

475
推荐指数
9
解决办法
26万
查看次数

如何在管道关闭时提前退出?

我使用 golang 来编写过于复杂而无法表达为 bash 函数的程序。程序逐行读取标准输入并将修改后的输出写入标准输出。

在 stdin 方法中迭代所有行的问题在于它不会提前退出。例如,以下命令将处理所有行而不是 10 行:

cat largefile | custom-program | head -n 10
Run Code Online (Sandbox Code Playgroud)

本机 unix 应用程序如何设法提前退出,我如何在自定义脚本中执行相同操作?

scripting bash pipe

5
推荐指数
1
解决办法
2684
查看次数

使 tail -f 在损坏的管道上退出

我想观看一个文件,直到出现一些文字

我找到了这个答案:`tail -f`直到看到文字

但是当我在 ubuntu 上尝试时,它没有退出:

$ echo one > test.txt
$ echo two >> test.txt
$ echo three >> test.txt
$ echo four >> test.txt
$ cat test.txt | sed '/w/ q'
one
two
$
Run Code Online (Sandbox Code Playgroud)

按预期工作。但是当我尝试拖尾文件时

$ tail -f test.txt | sed '/w/ q'
one
two
Run Code Online (Sandbox Code Playgroud)

它永远不会退出。即使管道破裂,尾巴也不会停止。

有人知道tail退出时如何sed退出吗?

pipe sed tail

5
推荐指数
1
解决办法
1868
查看次数

tail a log util 关键字发现或超时

我正在使用一种特殊的方式,可以让我访问谷歌。现在的页面有很大不同...所以我可以正常编辑问题并评论答案。我删除了更多早期的讨论并进入正题。

当找到脚本执行下一个命令的关键字时,我想停止拖尾并返回 0。如果一分钟后没有找到关键字,整个脚本将停止并返回错误代码。我正在使用,set -euxo pipefail这是必要的。

timeout 1m tail -Fn 0 --pid=$(ps -ef | grep "sed /$keywords" | grep -v grep | awk '{print $2}') $log_file | sed "/$keywords/q"
Run Code Online (Sandbox Code Playgroud)

我之前使用的上面的命令在我测试时接缝正常。但在 Jenkins 中,当找到关键字时,有时它会返回“构建步骤‘执行 shell’将构建标记为失败”。

我手动重启程序后找到了原因。它返回代码141。所以我查找了代码,发现它与http://www.pixelbeat.org/programming/sigpipe_handling.html中的tail -f管道相关。|


为了我的目的,我修改了其他问题中的命令。看起来一切都很好,只是“tail -Fn 0 balabala.log”仍然留在后台,几分钟后就消失了。但它距离目标最近。

{ sed /"$keywords"/q; kill -13 $!; } < <(exec timeout 1m tail -Fn 0 $log_file)
Run Code Online (Sandbox Code Playgroud)

这超出了我的理解范围...我查阅了用法但仍然感到不确定。

  1. 我改为kill -s PIPE "$!"缩短kill -13 $!脚本。
  2. 我仍然对 的用法感到困惑{ } < <()。它们对我来说就像陌生的词......
  3. 可以exec …

sed tail timeout jenkins

5
推荐指数
1
解决办法
1084
查看次数

默默杀死子shell?

我想实现类似这个Q/A 的东西,但是对于一个子外壳。这是我正在尝试的最小示例:

(subshell=$BASHPID
  (kill $subshell & wait $subshell 2>/dev/null) &
sleep 600)

echo subshell done
Run Code Online (Sandbox Code Playgroud)

我怎样才能让它只subshell done返回而不是:

./test.sh: line 4:  5439 Terminated              ( subshell=$BASHPID; ( kill $subshell && wait $subshell 2> /dev/null ) & sleep 600 )
subshell done
Run Code Online (Sandbox Code Playgroud)

编辑:我在这里的术语可能是错误的,通过子外壳我的意思是第一组括号内的过程。

更新:

我想发布来自实际程序的片段以供上下文,上面是一个简化:

# If subshell below if killed or returns error connected variable won't be set
(if [ -n "$2" ];then

      # code to setup wpa configurations here

      # If wifi key is wrong kill subshell …
Run Code Online (Sandbox Code Playgroud)

kill subshell output

4
推荐指数
1
解决办法
2746
查看次数

标签 统计

pipe ×3

sed ×2

tail ×2

bash ×1

buffer ×1

jenkins ×1

kill ×1

output ×1

scripting ×1

shell ×1

subshell ×1

timeout ×1