寻找匹配的“”时出现意外的 EOF

寻找匹配的“”时出现意外的 EOF

我有以下(已编辑)脚本:

#!/bin/bash

set -x

if ps -lf | grep cata |  perl -ane '($h,$m,$s) = split /:/,$F +[13]; kill 9, $F[3] if ($h > 1); then
   ...    
else
   ...
fi
set +x

运行此脚本时,我收到此错误:

/bin/kill.sh: line 8: unexpected EOF while looking for matching `''
/bin/kill.sh: line 20: syntax error: unexpected end of file

怎么了?

答案1

你还没有关闭perl命令。它需要如此perl 'foo',而你已经做到了perl 'foo。只需将您的脚本更改为:

if ps -lf | grep cata |  
    perl -ane '($h,$m,$s) = split /:/,$F +[13]; kill 9, $F[3] if ($h > 1)'; then

这将解决语法错误。但是,您的脚本仍然无法按您的预期工作。首先,当你运行 时ps | grep foo,你总是会得到至少一个结果:grep 进程本身:

$  ps -lf | grep cata
0 S terdon    6400  4889  0  80   0 -  3183 -      19:03 pts/0    00:00:00 grep --color cata

其次,您不会告诉perl脚本根据其是否匹配以不同的状态退出。因此,您的if条件将始终为真,因为 perl 脚本将始终运行,无论它是否正在执行任何有用的操作。


更重要的是,你正在重新发明轮子。如果我理解正确的话,cata如果该进程已经运行了一个多小时,那么您想要终止该进程。至少我思考这就是您期望 Perl 脚本执行的操作(事实并非如此,但没关系)。如果是这样,您所需要的只是:

kill -9 $(ps -o pid=,etimes= -p $(pgrep cata) | awk '$2>3600{print $1}')

这可能需要一些解释。该ps命令可以被告知仅使用该-p选项列出特定的 PID,并使用-o.在这里,我告诉它打印 PID 和经过的时间(以秒为单位)。该pgrep命令打印任何符合给定模式的 PID。因此,将在任何进程匹配的进程上ps -p $(pgrep cata)运行。psPIDcata

由于该-o标志指示ps仅打印 PID 和经过的时间,因此awk将检查经过的时间(第二个字段,$2)是否大于一小时(3600 秒),如果是,它将打印第一个字段,即PID。因此,结果将是已运行超过一个小时的进程ps ... | awk的 PID 列表。cata然后将该列表提供给kill -9命令。

答案2

在你真正忘记'之前添加一个:;

if ps -lf | grep cata | perl -ane '($h,$m,$s) = split /:/,$F +[13]; kill 9, $F[3] if ($h > 1)'; then

相关内容