17

У меня есть проблема относительно того, как убить процесс в Cygwin на Windows. Я совершенно новичок в Cygwin. Но у меня есть задача, которую я просто не могу убить. Я попытался выполнить следующие команды:

kill 4568
kill -9 4568
/bin/kill -f 4568

Я ввел команды в отдельном терминале Cygwin, так как не могу нажать Ctrl+C в терминале Cygwin, где выполняется процесс. Я искал по всему интернету без успеха.

7 ответов7

24
ps -W | awk '/calc.exe/,NF=1' | xargs kill -f

Или же

ps -W | awk '$0~v,NF=1' v=calc.exe | xargs kill -f

Или же

powershell kill -n calc
7

Вы можете попробовать:

taskkill /pid 4568
4

Если вы хотите решение BASH only, попробуйте это: (это работает для меня)

    KILLPS="<My Process Name>"
    WINPS=`ps -W | grep -i $KILLPS`         # Make case-insensitive.
    PID=`echo $WINPS | cut -d' ' -f1` 
    /bin/kill -f "$PID"

ПРИМЕЧАНИЕ: используйте /bin /kill, встроенная команда kill не будет уничтожать PID для общих процессов Windows.

2

(Из моего ответа на аналогичный вопрос по SO):

Различные программы Windows будут обрабатывать сигналы, которые убивают, по-разному; они никогда не были предназначены для того, чтобы иметь с ними дело так же, как программы для Linux/Cygwin.

Единственный надежный способ уничтожения программы Windows - использовать специальный инструмент для Windows, такой как диспетчер задач или обозреватель процессов.

Тем не менее, если вы еще этого не сделали, возможно, вам повезет с запуском терминала Cygwin в режиме администратора (щелкните правой кнопкой мыши по ярлыку и выберите "Запуск от имени администратора").

1

Здесь нужно подумать о двух вещах:

  1. Получите правильный PID, который является WINPID.
  2. Используйте правильный инструмент.

Чтобы получить правильный WINPID для уничтожения, используйте cat /proc/<PID>/winpid . Т.е. запустить это:

ZID=$$; WINPID=$(cat /proc/${ZID}/winpid); echo "Kill WINPID: ${WINPID}"; ps; sleep 10 &

и сразу после сделать еще один ps .

Правильный инструмент для использования является Sysinternals PsKill64.exe -t <winpid> , который убивает все потомок процесса сценария, которые kill не делают.

0

Если у вас есть программа Windows, которая является подпроцессом в процессе cygwin bash, вы можете использовать taskkill /F /PID [the cygwin process id] /T чтобы убить дерево процессов, не нужно получать PID окна от ps с помощью awk и т.д.
Это проверено под Win7 x64.

# Simple example in cygwin:
> notepad.exe &
> pid=$!
...
> taskkill /F /PID $pid /T

Конечно, вы также можете использовать Window PID.

0

В Git Bash я использую:

targetProcess='chromedriver.exe';
ps -W | grep -i ${targetProcess} | awk '{print $1}' | while read pid; do taskkill //PID ${pid}; done;

Я не пробовал это в Cygwin, но я полагаю, это будет работать там же.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .