우와~ 정말 대단하십니다.
유닉스 도사이신가 봅니다. ^^
정말 감사합니다... 지식 향상에 많은 도움이 되었습니다.
kill 명령어는 파이프로 인수를 못 받는거 같더라구요...
그래서 그 방법은 포기 하고... 구석탱이에 널부러져 있던
유닉스 기초 책을 펴 봤더니 손쉬운 방법이 있더군요...
제가 죽여야할 스크립트가 실행될 때, 아예 그 pid를
저장을 해 놓는 거였습니다.
쉘변수 중에 $$ 라는게 있던데, 이게 실행되는 자신의
프로세스 아뒤를 가지고 있더군요. 그래서...
echo $$ > pid 해서 저장해 놓았다가, kill하는 스크립트에서
pid=`cat pid`
kill -9 $pid
이렇게 해버렸습니다.
잘되더군요... ^^
님이 가르쳐 주신 방법으로도 해봐야 겠네요.. 내일...
답변글 정말 감사드리구요...
앞으로도 모르는거 생기면
또 질문 올리겠습니다.
그럼20000.
[산이]님이 남기신 글:
>일단,
>
># ps -ef | grep aaa | awk '{print $2}' | kill -9
>
>이런 명령어 결과는 제대로 수행되지 않거나 에러날 확률이
높습니다.
>즉 kill 옵션 다음에 반드시 PIDs가 나와야 하는데
>표준 출력을 표준입력으로 받지 못하기 때문에 파이프 연결시
되지
>않습니다.
>
>또한 ps 수행시간이 길면 grep 명령어로 파이프 연결할
경우
>자기 자신까지도 포함되므로 이 부분도 체크해야
합니다.
>
>굳지 파이프로 연결해서 kill 명령어를 사용하려면
>
>예)
># kill -9 $(ps -ef | grep 'aaa' | grep -v 'grep' | awk '{print $2}') \
>2>/dev/null
>
>이와 같은 방법으로 해야합니다.
>(참고로 mysqld 같은 데몬은 그 방식이 약간 다르므로
주의하세요)
>
>프로세스를 죽이는 쉘스크립트를 짜고 있다면
>ps 와 파이프 연결 대신 pidof 또는 killall 명령어를 사용해
보세요.
>
>...
>
>그리고
>ps 명령어는 3가지 방식의 옵션이 있습니다.
>예를들어,
>
># ps -ef f --width 200
>
>이와 같이 옵션을 복합하여 사용할 수도 있는데
>
>1. 첫번째 -ef 와 같이 대쉬(-)를 하나 사용할 경우 Unix98
스타일이고,
>2. 두번째 f 옵션과 같이 대쉬가 없는 경우는 BSD
스타일,
>3. 세번째 --width 200과 같은 경우는 GNU 스타일입니다.
>
>또한 각각의 방식에서 옵션은 비슷하지만 모두 같지는
않습니다.
>예를들어,
>앞에서 -ef 에서 f는 '-f' 옵션으로 Unix98 스타일 옵션의
>'full listing'을 의미합니다.
>반면 그 다음 옵션에서 대쉬(-)가 없는 'f' 옵션은 BSD
옵션으로
>프로세스를 tree 구조와 같이 출력합니다.
>
>따라서
>
># ps -ef
># ps -e f
>
>의 결과는 각각 다릅니다.
>
>우선 이렇게 옵션 방식에 따라서 다르다는 것을 염두해
두세요.
>
>...
>
>ps 명령결과는
>output 폭에 관한 옵션이 없다면, 실제로 화면(스크린)에
보이는 것과
>파이프로 연결하거나 파일로 쓰기할 경우는 약간
다릅니다.
>
># ps --info
>BSD j OL_j
>BSD l OL_l
>BSD s OL_s
>BSD u OL_u
>BSD v OL_v
>SysV -f (none)
>SysV -fl (none)
>SysV -j (none)
>SysV -l (none)
>
>procps version 2.0.7
>Linux version 2.4.19
>Compiled with: libc 6, internal version 2.2
>
>header_gap=-1 lines_to_next_header=1 max_line_width=80
>screen_cols=116 screen_rows=35
>
>personality=0x00000000 (from "unknown")
>EUID=0 TTY=136,1 Hertz=100
>#
>
>참고로 output 폭에 관한 옵션은
>
>-w, w, --width, --cols, --columns, ...
>
>등이 있습니다.
>
>
>output 폭 옵션이 없다면 앞의 결과에서
>파이프나 파일로 쓰기할때는 그 폭을 max_line_width=80 을
사용합니다.
>(이값에 대한 기본값 설정은 저도 잘모르겠네요..
아마 컴파일시...)
>
>화면에 보이는 폭은 screen_cols=116 으로써 이 값은
>현재 화면(창)의 가로 크기에 따라 계속 유동적으로
변합니다.
>(따라서 명령어 라인이 길어도 한 줄에 한 프로세스씩
출력)
>
>
># ps -ef | grep 'aaa'
>
>이 옵션은 Unix98 스타일 옵션으로 output 폭 옵션이 없기
때문에
>파이프 전에는 화면에 꽉찬 내용을 볼 수는 있지만
>파이프나 파일로 쓰기하면 한 줄당 최대 80 칸(cols) 정도만
출력합니다.
>
>따라서 화면에 보이는 내용과 정확히 똑같이 output
하려면
>화면에 보이는 폭(예: screen_cols=116) 값을 먼저 알아 본
다음에
>
># ps -ef --cols 116 | grep 'aaa'
>
>이와 같이 --cols, --width 옵션을 사용하여 직접 폭을
지정해줘야
>합니다.
>
>그런데 이와 같이 하면 좀 불편하죠..
>그래서 wide-output 옵션(-w, w)을 사용하면 모든 명령어
라인
>옵션울 볼 수 있습니다.
>
># ps -efw | grep 'aaa'
>or
># ps auwx | grep 'aaa'
>or
># ps aux --cols 200 | grep 'aaa'
>or
># ps aux --width 200 | grep 'aaa'
>
>
>참고로 mysqld 서버를 긴 옵션으로 가동해 놓고 'aaa' 대신
'mysqld'로
>테스트해 보세요.
>
>
>
>*PS)
>팁적인 성향이 있어서
>조금 길게 설명했습니다.(나중에
팁문서 작성에 이용)
>
>=============================================================
>
>[박세원]님이 남기신 글:
>
>>앗 지송... 제가 뭘 빠뜨렸네요...
>>
>>ps -ef | grep aaa | awk '{print $2}' | kill -9
>>
>>라고 해야 하는데...
>>
>>문제는 ps -ef 해서 출력되는것 하고,
>>
>>ps -ef를 파이프 연결이나 리다이렉션을 써서 파일로
>>
>>저장을 했을 때 나오는 게 틀리다는 겁니다.
>>
>>후자의 경우는 한줄에 표시되는 글자수가 제한이
>>
>>있는 것 같습니다. 직접해 보시면 아실 거예요...
>>
>>제가 쓰는 리눅스(파란7.1)에서는
그렇거든요...
>>
>>저만 그런건지...
>>
>>답변 감사 드립니다....
>>
>>[산이]님이 남기신 글:
>>
>>>[박세원]님이
남기신 글:
>>>
>>>>안녀하십니까?
>>>>
>>>>여기저기 돌아다니다 이 사이트를 발견하고
질문드립니다.
>>>>
>>>>저는 지금 와우리눅스 7.1 파란을 쓰고 있습니다.
>>>>
>>>>매일 00:00 시에 어떤 파일(aaa라 가정)을 실행시킬려고
하는데요.
>>>>
>>>>즉 어제 00:00시에 띄웠던 실행파일을 kill 시키고, 다시
띄울려구요.
>>>>
>>>>그래서 ps -ef | grep aaa | kill -9 를 실행해 보았지만
먹히질
>>>>
>>>>않네요.
>>>>
>>>>그냥 ps -ef 하면 분명 그 파일이 실행되고 있는데도
말입니다.
>>>>
>>>>ps -ef 를 해서 화면상에 디스플레이 하는 것 하고, 이걸
파이프나
>>>>
>>>>화일로 저장해서 보면 어떤 길이 이상의 것은 잘려서
나오거든요.
>>>>
>>>>그래서 위와 같은 현상이 나오는것 같은데, 해결책이
없을까요?
>>>
>>>========================================
>>>
>>>kill [-s sigspec | -n signum | -sigspec] [pid | job]...
>>>or
>>>kill -l [sigspec]
>>>
>>>따라서 당연히
>>>
>>>ps -ef | grep aaa | kill -9
>>>
>>>이런 명령은 되지 않습니다.
>>>즉 kill 옵션 다음에 pid 하나 또는 pid 리스트가 나와야
합니다.
>>>
>>>ps -ef | grep aaa
>>>
>>>이 경우는 pid 만 출력되는 것이 아니라 다른
정보까지
>>>출력되므로 pid 만 따로 또 뽑아야 합니다.
>>>
>>>--------------------
>>>#!/bin/sh
>>>
>>>program='aaa'
>>>
>>>pid=`/sbin/pidof $program`
>>>
>>>[ X"$pid" != X ] && kill -9 $pid
>>>
>>>## ...(이하 생략) ...
>>>
>>>exit 0
>>>--------------------
>>>
>>>이와 같은 쉘스크립트를 짜야 합니다.
>>
>>========================================
>
>========================================
========================================
|