小编des*_*ert的帖子

通过 ssh 在多台机器上的尾部日志文件

我正在尝试tail在多台远程机器上创建一个日志文件并将输出转发到我的本地工作站。我希望在按下Ctrl-时关闭连接C

目前我有以下功能,几乎可以按预期工作。

function dogfight_tail() {
 logfile=/var/log/server.log
 pids=""
 for box in 02 03; do
   ssh server-$box tail -f $logfile | grep $1 &
   pids="$pids $!"
 done
 trap 'kill -9 $pids' SIGINT
 trap  wait
}
Run Code Online (Sandbox Code Playgroud)

连接关闭,我从tail. 但是,由于输出是成批出现的,因此存在某种缓冲。

这是有趣的部分……

我可以在执行以下操作时看到相同的缓冲行为,并将“测试”附加到/var/log/server.log远程机器上的文件4-5 次……

ssh server-01 "tail -f /var/log/server.log | grep test"
Run Code Online (Sandbox Code Playgroud)

......并找到了两种禁用它的方法......

  1. 将 -t 标志添加到 ssh。

    ssh -t server-01 "tail -f /var/log/server.log | grep test"
    
    Run Code Online (Sandbox Code Playgroud)
  2. 从远程命令中删除引号。

    ssh server-01 tail -f /var/log/server.log | grep …
    Run Code Online (Sandbox Code Playgroud)

linux ssh tail

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

为什么打开文件比读取可变内容更快?

bash脚本中,我需要来自/proc/文件的各种值。到现在为止,我有几十行像这样直接 grep 文件:

grep -oP '^MemFree: *\K[0-9]+' /proc/meminfo
Run Code Online (Sandbox Code Playgroud)

为了提高效率,我将文件内容保存在一个变量中并进行了搜索:

a=$(</proc/meminfo)
echo "$a" | grep -oP '^MemFree: *\K[0-9]+'
Run Code Online (Sandbox Code Playgroud)

而不是多次打开文件,这应该只打开一次并grep变量内容,我认为这会更快 - 但实际上它更慢:

grep -oP '^MemFree: *\K[0-9]+' /proc/meminfo
Run Code Online (Sandbox Code Playgroud)

dash和也是如此zsh。我怀疑/proc/文件的特殊状态是一个原因,但是当我将 的内容复制/proc/meminfo到常规文件并使用它时,结果是相同的:

a=$(</proc/meminfo)
echo "$a" | grep -oP '^MemFree: *\K[0-9]+'
Run Code Online (Sandbox Code Playgroud)

使用 here 字符串来保存管道使其稍微快一点,但仍然不如文件快:

bash 4.4.19 $ time for i in {1..1000};do grep ^MemFree /proc/meminfo;done >/dev/null
real    0m0.803s
user    0m0.619s
sys     0m0.232s
bash 4.4.19 $ a=$(</proc/meminfo)
bash 4.4.19 $ time for i in {1..1000};do echo …
Run Code Online (Sandbox Code Playgroud)

shell bash zsh shell-script variable

36
推荐指数
2
解决办法
4784
查看次数

如果计算机在指定时间关闭,`at` 是否稍后运行命令?

我想用 来安排作业at,但我不确定如果计算机在指定时间挂起会发生什么:计算机再次唤醒后会立即执行命令(如anacron)还是根本不执行(像cron)?

如果您指定一个作业在过去的特定时间和日期绝对运行,该作业将尽快运行。

这就是联机帮助页所说的内容,但是它与我的情况不太匹配:我不想指定过去运行的作业,我想在将来运行它并询问at如果计算机将如何处理它然后正在睡觉。

这不是计算机休眠时运行命令的副本,因为此问题询问是否at会唤醒计算机以执行命令,也不是如何防止 atd 运行过去的作业?因为这是关于如何防止at执行那些“旧”作业(尽管答案非常好!)。

scheduling at

21
推荐指数
1
解决办法
1030
查看次数

如何在提示后自动插入字符串

我有一个bash终端窗口,我在其中执行一个命令foo。因此,我希望每一行(当然在提示之后)都以“foo”开头,这样我只需输入函数的选项和参数,而不是循环函数名称。当然,能够更改自动插入的字符串也很好,但这对我来说不是必需的。

例子

当我打开终端时,不输入任何内容,我想看到的是:

user@host:~/ $ foo 
Run Code Online (Sandbox Code Playgroud)

然后我输入--option argument,当我按下Enter该函数时foo,将使用给定的--optionand调用该函数argument

我试过的

我试图摆弄$PS1$PROMPT_COMMAND使用xdotool type "foo "并且令人惊讶的是它确实有效,但不幸的是它也在提示之前打印了“foo” ,这非常难看:

user@host:~/ $ PROMPT_COMMAND='xdotool type "foo "'
foo user@host:~/ $ foo 
Run Code Online (Sandbox Code Playgroud)

我还发现并尝试了Ryan Caloras 的 bash-preexec script 中preexec函数,但它有完全相同的问题。

如何将 (a (executable-)string) 回显到提示中,使光标在行尾闪烁?是相关的,但那里的答案无法--option argument向要执行的命令添加某些内容 ( )。不过我没有测试zsh——bash对于这么简单的事情应该有一个解决方案,你不觉得吗?

command-line bash prompt

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

为什么 abiword 告诉用户要得到生活?

当在abiword无头机器上调用文字处理器时,发出的警告之一如下(强调我的):

** (abiword:2020): WARNING **: clutter failed 0, get a life.
Run Code Online (Sandbox Code Playgroud)

这个警告是什么意思?这是复活节彩蛋吗?为什么abiword要说这种尖酸刻薄的话?没有 GUI 会话,没有生命——这是暗示吗?

Abiword 的 SVN 存储库可以在abisource.com找到

command-line gui headless

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

标签 统计

bash ×2

command-line ×2

at ×1

gui ×1

headless ×1

linux ×1

prompt ×1

scheduling ×1

shell ×1

shell-script ×1

ssh ×1

tail ×1

variable ×1

zsh ×1