2016-06-27 6 views
0

У нас есть сценарий, который извлекает все активные процессы и убивает его. Но по какой-то причине я получаю ошибку ниже:Ошибка команды обнуления команды

:: INFO :: /AA/AAA/AAA/AAA/AAA/AAA/AAA/AAA \ Servers.sh :: 2016-06 -26: 04: 00: 04: FORCE KILLING ОСТАЛОСЬ SERVER ПРОЦЕССЫ

:: INFO :: /AA/AAA/AAA/AAA/AAA/AAA/AAA/AAA \ Servers.sh :: 2016- 06-26: 04: 00: 04: force_stop_managed_servers kill: usage \: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... или убить -l [sigspe \ с]

My Script имеет функцию ниже, чтобы заставить убить процессы.

function force_stop_managed_servers() { 

     printf "\n\n:: INFO :: $0 :: `date +%Y-%m-%d:%H:%M:%S` :force_stop_managed_servers called" 
     cd $SCRIPT_DIR 
     kill -9 $(ps -ef | grep SONARPOTY | grep $USER | grep -v "grep" | grep -v "StopManagedServers" | grep -v "controller"| awk '{ print $2 }') 
     printf "\n\n:: INFO :: $0 :: `date +%Y-%m-%d:%H:%M:%S` :force_stop_managed_servers done" 
} 

Пожалуйста, дайте мне знать, почему я получаю эту ошибку.

+0

Попробуйте использовать 'set -x', и вы, вероятно, увидите, что' kill' получил неправильное обращение. (Кроме того, http://www.shellcheck.net покажет, что у вас есть другие потенциальные ошибки.) – Biffen

+0

Убедитесь, что 'USER' не пуст, а также есть только один pid, полученный в результате большой команды. – Fazlin

+0

@Fazlin: длинная команда НЕ вернет один идентификатор процесса. Он вернет несколько процессов. Можете ли вы предложить, каков недостаток, если он возвращает несколько процессов, а также возможное решение для преодоления этого? –

ответ

0

Эта ошибка возможна, если команда 'kill -9' вызывается без аргумента. Вы можете выполнить команду long line и назначить вывод переменной. Позже проверьте, что переменная для not empty и передайте эту переменную в качестве аргумента для команды kill.

0

Пакет procps имеет лучшую возможность для обработки выбора процесса и отправки сигналов выбранным процессам, кроме util-linux-ng, в сочетании с grep.

Очень часто встречаются сценарии, которые используют grep для выбора идентификатора процесса из списка процессов.

ps -ef | grep pattern | grep -v grep | awk '{print $2}' 

Однако, это может быть сокращен до:

pgrep pattern 

обоих случаях напечатает PID процесса, имя которого pattern. Существует одно предостережение, хотя вторая версия соответствует шаблону против имен процессов. Если вам нужно сопрягать с аргументами команды вам нужно что-то вроде:

pgrep -f pattern 

Ограничения поиска процессов, принадлежащих пользователя. Некоторые попытки ввести имя пользователя grep. И pgrep, и ps принимает -u username, чтобы перечислять только процессы, принадлежащие пользователю.

Вместо того чтобы писать:

ps -ef | grep username | grep -v grep | awk '{print $2}' 

Try:

pgrep -u username 

Если вам нужно, чтобы убить этих выбранных PID с, вам не нужно будет запускать kill против результатов. Все, что вам нужно, это использовать pkill вместо pgrep.

pkill -u username pattern 

Если вы действительно ограничены использованием ps и kill по какой-либо причине вы можете иметь, ps позволяет форматированный вывод. Таким образом вы можете grep для рисунка без непреднамеренного получения PID самого grep.

kill -9 $(ps -u username -opid=.comm= | grep pattern | awk '{print $1}') 

Единственный недостаток с помощью kill $() является то, что $() может вернуться и пустой, и вы получите сообщение об ошибке вы получите. Решение заключается в том, чтобы отправить сообщение об ошибке в /dev/null. pkill не будет жаловаться, даже если убить нечего.

Наконец, если вам нужно сопоставить аргумент команды вместо самой команды, используйте -opid=,args= для вывода аргументов вместо вывода команды.

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