我有以下(已编辑)脚本:
#!/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)
运行。ps
PID
cata
由于该-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