티스토리 뷰

'장비1' 에서 '장비2' 로 kill 명령을 보내려고하는데 ssh 를 통해 보내려고한다.

다들 알겠지만 kill 명령은 대부분

 

kill [-signum] PID

 

 

와 같은 식으로 작성을 하는게 대부분인데

java 의 pid 를 얻기위해 awk 명령을 섞어서 쓰기 마련이다
(여기에 특정 1개의 프로세스만 종료시켜야하는 경우 아래 예시와같이 grep 을 하나 더 붙여서 unique 한 값을 반환하기도한다.)

 

user@장비1_host]$ ssh user@장비2_host "kill -9 ps -ef | grep 'java' | grep 'test.application' | grep -v 'grep' | awk {print $2}"

 

grep 하는 프로세스의 PID 를 가져올수도 있기때문에 grep -v 'grep' 도 추가해준다

 

여기서 ssh 로 보내 연산을 할 경우 $는 인식을 하지않기때문에 역슬래쉬를 넣어줘야한다.
내용은 아래 stackoverflow 를 참고하시길
https://stackoverflow.com/questions/14707307/how-to-use-bash-awk-in-single-ssh-command

 

How to use bash $(awk) in single ssh-command?

I am trying to execute a single command over ssh that contains `sub-code` or $(sub-code) (I use it all the time but I don't know the official name for that) to be executed first, but on the target ...

stackoverflow.com

 

단순하게 이런식으로 작성을 하게되면 "" 에 있는 내용은 정상적으로 연산하지 않고
감싼 부분이 grep 은 연산하되 awk 를 연산하지 않아 ps -ef | grep 'java' | grep 'test.application' 에 대한 연산을 반환하여 kill 명령이 실패하게된다

이게 재밌는건 1번 장비에서 현재 HOST 로 보낸 kill 은 정상적으로 작동하지만 ssh 로 접근한 장비2 는 kill 에 대한 usage 를 알려주며 kill 에 대한 명령 자체가 실패하게된다

그래서 대체로 시도해 볼수 있는게 "" 의 내용을 ${} 로 바꿔 시도해볼수 있는데
예시로 작성하게되면 아래와같이 볼수 있다

 

user@장비1_host]$ ssh user@장비2_host "kill -9 ${ps -ef | grep 'java' | grep 'test.application' | grep -v 'grep' | awk '{print \$2}'"

 

이렇게 시도할 경우 bad substitution 이라는 메세지를 보내고 동작하지않는다.

다시 돌아와 해결방법은 $ 와 " ` " 앞엔 무조건 역슬래시를 붙여주면 해결이 된다.

 

user@장비1_host]$ ssh user@장비2_host "kill -9 \`ps -ef | grep 'java' | grep 'test.application' | grep -v 'grep' | awk '{print \$2}'\`"

 

이렇게하면 정상적인 수행이 가능하다.

결국 문제는 escape 처리였다

'프로그래밍언어 > ShellScript' 카테고리의 다른 글

shell script 정리(개요)  (0) 2014.05.16
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함