2014-08-27 2 views
3

Я пытаюсь написать простой скрипт для уничтожения процесса. Я уже прочитал Find and kill a process in one line using bash and regex, поэтому, пожалуйста, не перенаправляйте меня на это.Как сохранить вывод команды bash в переменной?

Это мой код:

LINE=$(ps aux | grep '$1') 
PROCESS=$LINE | awk '{print $2}' 
echo $PROCESS 
kill -9 $PROCESS 

Я хочу, чтобы иметь возможность запускать что-то вроде

sh kill_proc.sh node и запустить его

kill -9 node

Но вместо того, что я получаю

kill_process.sh: line 2: User: command not found 

Я узнал, что когда я регистрирую $PROCESS, он пуст. Кто-нибудь знает, что я делаю неправильно?

+1

'' var = 'command'' ' –

+2

' PROCESS = $ LINE | awk '{print $ 2}' 'неверно. Сравните его с первой строкой. –

+1

@EtanReisner, если я попробую 'PROCESS = $ (LINE | awk '{print $ 2}')' Я все еще получаю сообщение об ошибке 'LINE': command not found' – dopatraman

ответ

3
PROCESS=$(echo "$LINE" | awk '{print $2}') 

или

PROCESS=$(ps aux | grep "$1" | awk '{print $2}') 

Я не знаю, почему вы получаете ошибку вы цитируемый. Я не могу воспроизвести его. Когда вы говорите, это:

PROCESS=$LINE | awk '{print $2}' 

оболочка расширяет его на что-то вроде этого:

PROCESS='mayoff 10732 ...' | awk '{print $2}' 

(Я сократил значение $LINE сделать пример для чтения.)

Первый подкоманда наборов конвейеров переменной PROCESS; эта команда настройки переменной не имеет выхода, поэтому awk немедленно считывает EOF и ничего не печатает. И так как каждая подкоманда конвейера работает в подоболочке, параметр PROCESS имеет место только в подоболочке, а не в родительской оболочке, выполняющей сценарий, поэтому PROCESS по-прежнему не установлен для последующих команд в вашем скрипте.

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

Вместо установки PROCESS в субоболочке и ничего не подавая awk на стандартный ввод, вы хотите подать значение LINE в awk и сохранить результат в PROCESS в текущей оболочке. Поэтому вам нужно запустить команду, которая записывает значение LINE на свой стандартный вывод и подключает этот стандартный вывод к стандартным входам awk. Команда echo может это сделать (или команду printf, как отметил в своем ответе чепнер).

2

Вы должны использовать echo (или printf) на самом деле поставить значение $LINE на стандартный ввод команды awk.

LINE=$(ps aux | grep "$1") 
PROCESS=$(echo "$LINE" | awk '{print $2}') 
echo $PROCESS 
kill -9 $PROCESS 

Нет необходимости использовать LINE; Вы можете установить PROCESS с одной линией

PROCESS=$(ps aux | grep "$1" | awk '{print $2}') 

или лучше пропустить grep:

PROCESS=$(ps aux | awk -v pname="$1" '$1 ~ pname {print $2}') 

Наконец, не используйте kill -9; это последнее средство для отладки ошибочных программ. Для любой программы, которую вы сами не пишете, должно быть достаточно kill "$PROCESS".

+0

Немного несвязанный, но ... Я не могу фактически убить процесс. Мой скрипт больше не бросает ошибки, но процесс не убивается даже при запуске с 'sudo'. мысли? – dopatraman

+0

Поместите 'set -x' в начало скрипта, чтобы лучше понять, что он делает. Эта команда делает команду echo для каждой команды перед ее запуском. –

+0

@ dopatraman показать полную технологическую линию. Содержит 'Z' в поле' STAT'? (Z = Zombie - unkillable). Или, может быть, вы хотите убить процесс, ожидающий ввода/вывода ядра. – jm666

Смежные вопросы