Cách tốt nhất để giết chạy script Bash từ Cygwin đang sử dụng các công cụ SysinternalsPsKill64.exe
. Lý do là của Cygwin ps
cũng cung cấp cho PID của là khác nhau từ WINPID
.
Ngoài ra, pskill
cũng có cờ -t
làm mất toàn bộ cây quá trình, có nghĩa là bất kỳ luồng/quy trình phụ nào khác mà tập lệnh của bạn có thể đã bắt đầu. Tất nhiên kill -9 <PID>
cũng hoạt động, nhưng nó không giết con cháu đã được bắt đầu bởi kịch bản.
# cat sleeper.sh
ZID=$$
WINPID=$(cat /proc/${ZID}/winpid)
echo "WINPID: ${WINPID}"
sleep 10
Bây giờ chạy với:
$ ./sleeper.sh &
[1] 8132
WINPID: 8132
$ ps
PID PPID PGID WINPID TTY UID STIME COMMAND
#5280 1 5280 5280 ? 1001 14:21:40 /usr/bin/mintty
#7496 5684 7496 3836 pty0 1001 20:48:12 /usr/bin/ps
#5684 5280 5684 6052 pty0 1001 14:21:40 /usr/bin/bash
5948 8132 8132 3900 pty0 1001 20:48:11 /usr/bin/sleep
8132 5684 8132 8132 pty0 1001 20:48:11 /usr/bin/bash
Như bạn thấy, điều này bắt đầu hai quá trình, các bash
kịch bản chính và các chủ đề giấc ngủ. Vì vậy, nếu bạn kill -1 8132
luồng ngủ sẽ tiếp tục chạy, nhưng nếu bạn sử dụng pskill64 -t 8132
, bạn cũng sẽ giết tất cả các hậu duệ của nó. Tương tự như lệnh linux killall
.
Vâng, đó là lệnh giết Cygwin mà tôi đang sử dụng. Tôi đã thử/bin/kill -f -9 1234 và/bin/kill -9 1234 không thành công. 1234 là một Cygwin PID. – Jazz
Nếu bạn sử dụng -f, sau đó bạn nên cung cấp cho nó các PID Windows từ ps -W –
Ngoài câu trả lời tuyệt vời này - đôi khi khi quá trình bị khóa từ bên trong Windows, Cygwin giết sinh sản "không thể mở pid 1234" tin nhắn. Quá trình sau đó cần phải được mở khóa từ bên trong Windows đầu tiên. – Secko