문제의 스크립트는 내 로컬 호스트 포트 8080의 최신 프로세스를 종료합니다.
#!/bin/bash
x=$(lsof -i:8080 | tail -1 | awk '{print $2}')
kill -9 $x
스크립트 이름이 "killl"이면 작동하지 않습니다(알았나요? Kill 최신?). cmdsubst>
스크립트 이름을 "asdf"로 바꾸라는 메시지가 표시되었고 모든 것이 잘 작동했습니다. 이 행동에 대한 설명이 있습니까? 저는 MacOS El Capitán을 사용하고 있습니다.
답변1
cmdsubst>
zsh
입력 명령 대체가 완료되기를 기다리는 동안 쉘이 출력하는 보조 프롬프트입니다.
를 입력한 후 이 프롬프트가 표시되는 경우 유일하게 합리적인 설명은 종료되지 않은 명령 대체를 포함하는 항목으로 확장되는 killl<Return>
별칭(문자열 매크로 확장의 일종)이 있다는 것입니다. 예:killl
$(...)
$ alias 'killl=echo $(lsof -ti'
$ killl :22
cmdsubst>
여기서 명령 대체를 zsh
끄라는 메시지가 표시됩니다 $(...)
.
추가 참고사항:
- 의 출력은
lsof
pid를 기준으로 정렬됩니다. pid 번호는 래핑되어 있으며 pid가 더 크다고 해서 프로세스가 나중에 시작된다는 보장은 없습니다. -i:8080
포트 8080을 원본 또는 대상 포트로 사용하는 TCP 또는 UDP 소켓은 수신, 수락 또는 연결 소켓인지 여부에 관계없이 보고됩니다.- 단지 pid를 얻으려면 다음
-t
옵션을 사용할 수 있습니다lsof
.lsof -ti:8080 | tail -n2
kill -9
iskill -s KILL
는 애플리케이션이 정상적으로 종료될 수 없다는 신호를 보냅니다. 최후의 수단으로만 사용해야 합니다.
포트 8080에 소켓 바인딩(양쪽 끝)이 있는 최근에 시작된 프로세스를 종료하려면 다음을 수행할 수 있습니다.
#! /bin/sh -
unset IFS
pids=$(lsof -ti:8080) &&
LC_ALL=C ps -o pid=,lstart= -p $pids |
LC_ALL=C sort -k6,6n -k4,4M -k3,3n -k5,5 -k1,1n |
awk 'END{system("kill " $1)}'
(GNU sort
(macOS에 있음) 및 ps
이 lstart
열을 지원하는 구현(예: macOS 및 procps-ng, 월 및 일 필드가 교체되는 procps-ng에 대해 코드를 업데이트해야 함)을 가정).
답변2
그것은 나에게 힌트를 주었다
cmdsubst>
명령을 입력하면 입력되지 않기 때문입니다.
죽이다당신은 입력
죽여라$(또는 유사합니다. 이것은아무 관련이 없습니다스크립트인 경우에도 스크립트의 이름입니다. 전혀 존재하지 않는 명령을 사용하여 동일한 효과를 얻을 수 있습니다.
카이케$(쉘의 구문 분석기는 부분적으로 완료된 명령을 완료하려면 더 많은 입력이 필요합니다. 스크립트 이름에 대한 귀하의 아이디어는 완전한 붉은 청어입니다.