Неожиданный EOF при поиске подходящего ""

[112382]Информация о версии[12137]Например:[12138]ПРИМЕЧАНИЕ:[112878] Будьте осторожны, так как [112879]sh[112880] и [112881]bash[112882] не одно и то же. [112883]sh[112884] - это Bourne Shell, в то время как Bash - это Bourne Again Shell.[12139]Где это?[12140]Также в вашем случае, когда вы запускаете [112885]sh[112886], вы берете [112887]sh[112888] из [112889]/бина[112890] или [112891]/usr/бина[112892]. Bash, который вы установили через [112893]brew[112894], вряд ли находится на [112895]$PATH[112896], он находится в [112897]/usr/local/bin[112898].[12141]Всегда пытайтесь войти в привычку опрашивать систему о том, "откуда" на диске берется данный исполняемый файл. [12142]Раскрытие из хэша[12143]Чтобы заставить Bash распаковать расположение [112899]bash[112900], можно воспользоваться командой [112901]hash[112902]:[12144]The $PATH[12145]Вы можете сделать вновь установленный Bash предпочтительным, заказав ваш [112903]$PATH[112904] слегка отличающийся. [12146]
1
19.10.2015, 00:00
2 ответа

Вы не закрыли команду 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 .

4
27.01.2020, 23:13

Добавьте ' перед ; вы действительно забыли его:

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

Теги

Похожие вопросы