2013-06-18 5 views
0

Я пытаюсь запустить скрипт оболочки в Cygwin, но у меня возникла проблема с передачей переменных в подоболочку !!проблема с вызовом cygwin

У меня очень простой скрипт, который фактически принимает PID процесса, и оттуда я хотел бы убить процесс из скрипта.

# my_proc_kill.sh 
# 
export c=$(ps -W | grep -ir behave | sed 's/\([0-9]\+\).*/\1/') 
echo $c 
#1 
/bin/kill -f $c  
#2     
sh -c '/bin/kill -f ${c}' "$c" 
#3  
sh -c '/bin/kill -f [email protected]' _ "$c"   
#4 
e=$(taskkill /PID $c) 

Я попытался убить процесс четырьмя различными способами, и не сработал!

Я не знаю, почему (# 1) и (# 4) работают нормально, если я вызываю их непосредственно в терминале Cygwin, но не при запуске «my_proc_kill.sh».

Еще одна вещь, которую я заметил, это то, что для (# 4), если я заменил «$ c» на фактический номер процесса, а затем запустил «my_proc_kill.sh», тогда это сработает. Таким образом, похоже, что значение переменной «$ c» не передается «taskkill» !! Как я могу изменить код, чтобы taskkill узнал о переменной «$ c»?!?

Но не следует ли устанавливать PID для определенного процесса, если я не убил процесс, независимо от того, в какой оболочке я обращаюсь к этому идентификатору процесса?

Просьба сообщить, как обойти это?

Вот сообщения об ошибках, которые я получаю, когда я бегу сценарий:

5040 
kill: illegal pid: 5040 
kill: illegal pid: 5040 
kill: illegal pid: 5040 
kill: illegal pid: 
ERROR: Invalid query 

Почему «убить» видит это как нелегальный PID? Но когда я использую тот же номер PID (в данном случае 5040) в терминале Cygwin, он работает? (все в порядке)

$/bin/kill -f 5040 

Любая идея, как это решить?

Заранее спасибо.

+0

1. замените 'echo $ c'' echo. $ C.', чтобы убедиться, что $ c не содержит пробелов или около того. 2. что убивает -f? неизвестно на моем ubuntu 10. 3. не 'ps -W | grep -ir behave ... 'также печатает pid grep? 4. почему grep -r? 5. Что такое ps -W? – user829755

+0

Я думаю, что это не проблема. Поскольку внутри скрипта я просто заменил $ c фактическим номером PID (для моего случая 5040), и у меня остались те же самые ошибки, что и раньше.Другими словами, я сменил свой сценарий на (/ bin/kill -f 5040) по-прежнему то же самое. Я также пробовал (/ bin/kill/5040) по-прежнему ту же ошибку. Но когда я набираю это точное выражение (/ bin/kill -f 5040) в командной строке Cygwin, он убивает процесс, и все выглядит нормально. – user2201373

ответ

0

Ваш вывод указывает, что вы пытаетесь убить один и тот же PID 5 раз.

Я побежал модифицированную версию сценария с помощью Cygwin красно-шляпа (CYGWIN_NT-6,1-WOW64):

#!/bin/bash 

export c=$(ps -W | grep -ir notepad | sed 's/\([0-9]\+\).*/\1/') 
echo $c 

/bin/kill -f $c 

я не получил каких-либо странное поведение. Успешный вызов kill выведет PID (который показан в первой строке).

Если повторить последнюю строку 4 раза, я получу сообщения об ошибках.

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

Как альтернативное предложение, я использовал «грязный» способ, выполнив taskkill с аргументом/F в дополнение к опции/IMAGE, чтобы соответствовать имени exe вместо указания PID. Примеры, приведенные в:

taskkill /? 
+0

Я использую точную версию Cygwin (CYGWIN_NT-6.1-WOW64), и я просто удалил все остальное из своего скрипта и оставил ее так, как у вас есть (всего три строки), но опять же, после запуска, я получить «kill: незаконный pid: 11132», но 11132 - это правильный PID, как только я сделаю (/ bin/kill -f 11132) в командной строке, все работает отлично! Знаете ли вы, что может быть? – user2201373

+0

UPDATE: После долгого времени я только что решил проблему. Проблема все время была символом возврата каретки. Однажды в GVIM я установил «: e ++ ff = unix», я увидел все символы возврата каретки, и как только я прочитал о них, все стало нормально работать. – user2201373

+0

@ user2201373: Возможно, было бы неплохо добавить решение к вопросу или опубликовать его как ответ для более легкого поиска. –

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