我有一个调用两个命令的脚本:
long_running_command | print_progress
Run Code Online (Sandbox Code Playgroud)
在long_running_command打印的进展,但我很不满意它。我正在使用print_progress使其更好(即,我在一行中打印进度)。
问题:将管道连接到标准输出也会激活一个 4K 缓冲区,所以漂亮的打印程序什么都没有……什么都没有……什么都没有……很多……:)
如何禁用4K缓冲区long_running_command(不,我没有源)?
我使用 golang 来编写过于复杂而无法表达为 bash 函数的程序。程序逐行读取标准输入并将修改后的输出写入标准输出。
在 stdin 方法中迭代所有行的问题在于它不会提前退出。例如,以下命令将处理所有行而不是 10 行:
cat largefile | custom-program | head -n 10
Run Code Online (Sandbox Code Playgroud)
本机 unix 应用程序如何设法提前退出,我如何在自定义脚本中执行相同操作?
我想观看一个文件,直到出现一些文字
我找到了这个答案:`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退出吗?
我正在使用一种特殊的方式,可以让我访问谷歌。现在的页面有很大不同...所以我可以正常编辑问题并评论答案。我删除了更多早期的讨论并进入正题。
当找到脚本执行下一个命令的关键字时,我想停止拖尾并返回 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)
这超出了我的理解范围...我查阅了用法但仍然感到不确定。
- 我改为
kill -s PIPE "$!"缩短kill -13 $!脚本。- 我仍然对 的用法感到困惑
{ } < <()。它们对我来说就像陌生的词......- 可以
exec …
我想实现类似这个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)