basename 의 역할을 하는 쉘 스크립트

dcmru의 이미지

본 쉘에서 프로세스의 pid를 구하여 kill 할려고 합니다.

프로세스 네임이 유일하다면 문제가 안되겠지만, 유일하지 않다는 가정하에,

최소한의 문제가 안되는 범위로 스크립트를 짜면 되겠다는 생각이 들었습니다.

pidof, pkill, killall 등이 없다는 전제입니다. 물론 없는 환경이 있어서 그렇습니다.

그렇다면 실행되어 있는 프로세스를 경로를 제거한 basename 만 잘구하면 문제가 해결이 될 것 같습니다.

잘구한다면 최소한의 다른 프로세스를 죽일 일은 없을 것 같습니다.

그런데 같은 이름의 프로세스가 포크로 여러개 실행되어 있을 경우

ps -ef | grep "process_name$" | grep -v grep | awk '{ print $2, $8 }'

위와 같은 형식으로 그에 대한 프로세스 이름(경로 포함, 자세히 말하면 process_name로 끝나는 프로세스 이름)과 pid 까지는 구했습니다.

여기서 프로세스 이름과 pid 쌍으로 프로세스 이름의 basename 을 구해서 실행파일과 이름이 같다면

그 프로세스를 kill 하는 구조로 가면 될 것같다는 생각이 들었습니다.

그런데 위와 같은 구조로 짰는데, awk 내에서 가능하더군요.

문제는 awk 내에서 basename 과 같은 명령어를 사용하면(system 함수 이용) 출력 형태를 지정할 수가 없다는 문제가 생깁니다.

awk 내에서 system 함수를 이용하면 반환하는 값은 성공여부를 반환하기 때문입니다.

그래서 awk 내에서 basename 과 같은 행동을 하는 치환이나 정규식 등을 이용하여 basename을 구할 수 있냐 하는 것입니다.

즉 /usr/src/process_name, ./process_name, ./src/process_name 이런 형식에서 process_name만 구하는 것이죠.

basename 을 구해서 그게 실행파일과 이름이 같다면 kill 하면 될것같습니다. 좋은 방법 있을까요?

jg의 이미지

$BASENAME=bash
ps -ef | awk -v exe=$BASENAME '$8 ~ exe { gsub(/^[^\/]*\//, "", $8); print $2, $8 }'

$Myoungjin_JEON=@@=qw^rekcaH lreP rehtonA tsuJ^;$|++;{$i=$like=pop@@;unshift@@,$i;$~=18-length$i;print"\r[","~"x abs,(scalar reverse$i),"~"x($~-abs),"]"and select$good,$day,$mate,1/$~for 0..$~,-$~+1..-1;redo}

dcmru의 이미지

일단 실행해본 결과

$BASENAME=bash 는 $는 빼고 bash를 대입하는 것인가요?

위와 같이 실행하면, bash가 들어가는 프로세스 네임은 다가져오는 것 같습니다.

코드를 다 이해를 못해서 살펴보겠습니다. ^^;

----------------
노력만이 살길이다.

노력만이 살길이다.

jg의 이미지

이것도 가능한지 확인해보세요.

ps -o pid,fname -C bash | sed -n '1n; p'

$Myoungjin_JEON=@@=qw^rekcaH lreP rehtonA tsuJ^;$|++;{$i=$like=pop@@;unshift@@,$i;$~=18-length$i;print"\r[","~"x abs,(scalar reverse$i),"~"x($~-abs),"]"and select$good,$day,$mate,1/$~for 0..$~,-$~+1..-1;redo}

dcmru의 이미지

ps 에 -o 옵션이 없는 환경이 있습니다.
----------------
노력만이 살길이다.

노력만이 살길이다.

ironiris의 이미지

종료시키려는 프로그램이 직접 만드신 것이라면
pid 를 파일로 저장되게 하는 코드를 넣어서 그 파일을 이용해서 종료하는게 깔끔하지 않을까 싶습니다.
특히 임베디드장치라면 프로그램용량도 줄일수도 있고...
아니면 pkill 의 소스를 컴파일해서 넣는 것도 좋고요.

dcmru의 이미지

애석하게도 제가 직접 만든 것이 아닙니다.

그리고 프로세스가 죽으면 다시 띄우게 되어 있는데, 그 때마다 파일을 갱신해야되는 문제도 있습니다.

원래 죽이는 명령어도 있는데, 그것으로 실행하면 프로세스가 종료가 안될 때가 가끔 있어서 그렇습니다. ^^;

그래서 kill로 프로세스를 종료할려고 합니다.
----------------
노력만이 살길이다.

노력만이 살길이다.

dcmru의 이미지

ps 옵션에서

ps -ae | grep process_name 으로 하니 출력형태가

CMD가 basename 형태로 출력이 되는군요 @.@

그리고 -C 옵션이 cmdlist로 basename로 검색하는 것 같은데, -C가 없는 환경이 또 있네요 ㅡㅡㅋ
----------------
노력만이 살길이다.

노력만이 살길이다.

dcmru의 이미지

이렇게 해보면 되는군요. 하지만 awk 에서 system 함수를 지원해야 합니다.

ps -ae | grep "process_name$" | grep -v grep | awk '{ print $1, $4 }' | sort | awk '{
                if ( $2 ~ /^process_name$/ ) {
                        system("kill -9 " $1)
                }
        }'

----------------
노력만이 살길이다.

노력만이 살길이다.

jg의 이미지

위의 것을 정정하겠습니다.

BASENAME=[프로그램명]
 
for pid in `ps -ef | awk -v exe=$BASENAME '$8 ~ exe { gsub(/^[^\/]*\//, "", $8); print $2 }'`
do
        kill -9 $pid;
done

@@
ps -ae 의 경우에는 프로그램명이 길면 짤리는 단점이 보이는데 상관 없나요?

$Myoungjin_JEON=@@=qw^rekcaH lreP rehtonA tsuJ^;$|++;{$i=$like=pop@@;unshift@@,$i;$~=18-length$i;print"\r[","~"x abs,(scalar reverse$i),"~"x($~-abs),"]"and select$good,$day,$mate,1/$~for 0..$~,-$~+1..-1;redo}

dcmru의 이미지

ps -ae 로 보니 정말 프로그램명이 짤리는군요. 15자리 정도 보여주네요. 버전 3.2.3입니다.

그리고 gsub 함수에서 하는 기능을 프린트 해보니 전체경로를 나타내는 프로그램명에서 첫번째나오는 / 만 제거가 됩니다.

정규표현식을 살펴봐야겠습니다.
----------------
노력만이 살길이다.

노력만이 살길이다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.