티스토리 뷰
'장비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 |
---|