BASH - странные персонажи выходят из трубы - PullRequest
2 голосов
/ 03 апреля 2012

У меня есть этот сценарий, который просто убивает приложение

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

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

[user@server 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?Как я могу избавиться от них?

Ответы [ 3 ]

3 голосов
/ 03 апреля 2012

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

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

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 голос
/ 03 апреля 2012

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

pkill -f $KEY_NAME

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

1 голос
/ 03 апреля 2012

Может быть, дело в том, что число возвращенных pid больше 1 Измените вашу строку на

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