2012-04-03 3 views
2

У меня есть скрипт, который просто убивает приложение,BASH - странные персонажи выходят из трубы

KEY_NAME=/some/path 
kill `ps -ef | grep $KEY_NAME | grep -v grep | awk '{ print $2 }'` 
exit 0 

Если я пишу убить команду вручную, как Oneliner, чем он работает. Но я должен запустить его как скрипт, который не работает. Так что я пытался отладить и вот результат

[[email protected] logs]$ bash -x ./script.sh 
+ KEY_NAME=/some/path 
++ ps -ef 
++ grep /some/path 
++ grep -v grep 
++ awk '{ print $2 }' 
+ kill $'20557\r' 
: arguments must be process or job IDs 
+ exit 0 

Почему я получаю эти странные символы на kill линии? Как я могу избавиться от них?

+0

Что произойдет, если вы добавите голову -1 в этот конвейер? – alberge

+1

Вы пробовали 'killall'? Но если вы убиваете свою собственную программу, [вы можете захотеть пересмотреть] (http://mywiki.wooledge.org/ProcessManagement). – l0b0

+0

@ l0b0 У меня нет, и я, вероятно, не буду. Я не хочу в конечном итоге убивать больше процессов, чем я должен был бы ... – user219882

ответ

1

Может быть дело номер PID вернулся более чем 1 Изменить строку

ps -ef | grep $KEY_NAME | grep -v grep | awk '{ print $2 }'|xargs kill 
+0

Это помогло. Спасибо... – user219882

3

Причина, по которой вы получаете символы тарабарщины, вероятно (я не могу проверить это, потому что у меня нет доступа к вашей среде) из-за подоболочки, возвращающей более одной строки.

Попробуйте это:

KEY_NAME=/some/path 
for pid in $(ps -ef | grep $KEY_NAME | grep -v grep | awk '{ print $2 }') 
    do 
    kill $pid 
    done 
exit 0 
1

Вы могли бы заменить все, что с вызовом pkill. С опцией -f полная командная строка используется для сопоставления (а не только имени процесса), поэтому вы все равно можете сопоставлять пути.

pkill -f $KEY_NAME 

Помимо простоты, это дает вам более легкий контроль над тем, что нужно убить, например. убивая только процессы, принадлежащие конкретному пользователю/группе, или только самые старые/новейшие.