Вы не закрыли команду 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
можно указать, чтобы она перечисляла только определенные PID с помощью параметра -p
и печатала только определенные поля вывода с помощью -o
. Здесь я говорю ему распечатать PID и прошедшее время в секундах. Команда pgrep
печатает любые PID, соответствующие заданному шаблону. Итак, ps -p $ (pgrep cata)
будет запускать ps
на любом PID
, чей процесс соответствует cata
.
Поскольку флаг -o
указывает ps
печатать только PID и прошедшее время, awk
проверяет, истекшее время (второе поле, $ 2
) больше часа (3600 секунд), и если да, то будет напечатано первое поле, PID. Итак, результат ps ... | awk
будет списком PID процессов cata
, которые выполнялись более часа. Этот список затем передается команде kill -9
.
Добавьте '
перед ;
вы действительно забыли его:
if ps -lf | grep cata | perl -ane '($h,$m,$s) = split /:/,$F +[13]; kill 9, $F[3] if ($h > 1)'; then