シェルで実行したコマンドのPIDを取得してKILLする方法は可能か

このQ&Aのポイント
  • サーバの運用管理をしています。Solaris9のサーバでsnoopを採取するシェルを作成しました。
  • 問題は、snoopと名のつくプロセスをKILLする際に他の人のプロセスも誤ってKILLしてしまうことです。
  • そのため、実行したsnoopのPIDを取得してそのPIDのsnoopだけをKILLする方法は可能か検討しています。
回答を見る
  • ベストアンサー

■質問内容

■質問内容  シェルの中で実行したコマンドのPIDを取得して、  KILLすることは可能でしょうか? ■背景  サーバの運用管理をしています。  Solaris9のサーバで以下のように  snoopを採取するシェルを作成しました。  1.snoop採取  2.10分後、1で実行しているsnoopと名のつくプロセスをKILL  3.1と2を6回繰り返して1時間試料採取を実施  問題なのは、2.のsnoopと名のつくプロセスをKILLするというところで、  もし他の人がsnoopと名のつくプロセスを実行していた場合に、  KILLしてしまうことです。  そこで、1.で実行したsnoopのPIDを取得して、そのPIDのsnoopだけを  KILLすることは可能でしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • t-okura
  • ベストアンサー率75% (253/335)
回答No.1

bash だと、最後に起動したバックグラウンドプロセスの pid が $! 変数で取得できます。 Solaris9 のシェルが何かわかりませんが、同様な機能を持っている のではないでしょうか。

参考URL:
http://www.rhythm-cafe.com/shell/Grammer04.aspx
GORI_natukage
質問者

お礼

お礼が遅くなりましてすみません。 $!って一般的な変数だったんですね。 URL、とても参考になりました。

関連するQ&A

  • snoopコマンドをcshからkill出来ない

    soralis初心者です。 サーバの資料採取のため、以下の概要のcshを組み、クーロン登録しております。 (1)snoop起動(snoop1.csh ,snoop2.csh) snoop -o XXX01.snoop -d XXX01 snoop -o XXX02.snoop -d XXX02 (2)シェルの停止(snoopkill.csh) pgrep -f 'snoop' | xargs kill (1)の起動自体はうまく行えているのですが、 (2)の処理をcshから起動すると、プロセスが死にません。 ※詳細 (2)をクーロンから実行後、cshのプロセスは死んでいるが、 snoopコマンド自体のプロセスが生きたままになり、 snoopログが無限に作り続けられている状態です。 コマンド(pgrep -f 'snoop' | xargs kill)を直接コマンドラインから 入力すると、snoopのプロセスは全て死にました。 cshと通常のコマンド入力ではkillの作用が異なるのでしょうか? 御回答をよろしくお願いします。 --------------------------------------------------------- (1)起動後のプロセス状態 pgrep -lf 'snoop' 88889 sh -c /XXX/snoop1.csh 88888 sh -c /XXX/snoop2.csh 77777 snoop -o XXX01.snoop -d XXX01 77776 snoop -o XXX02.snoop -d XXX02 --------------------------------------------------------- --------------------------------------------------------- (2)起動後(クーロン)のプロセス状態 pgrep -lf 'snoop' 77777 snoop -o XXX01.snoop -d XXX01 77776 snoop -o XXX02.snoop -d XXX02 --------------------------------------------------------- --------------------------------------------------------- (2)のコマンドをコマンドラインから実行後のプロセス状態 pgrep -lf 'snoop' ---------------------------------------------------------

  • PIDではなくプロセス名を指定してkillする方法

    PIDではなくプロセス名を指定してkillする方法 皆さんこんにちは。 Linuxで使うkillコマンドに関して教えてほしいことがあります。 killを使う際は、 killの後ろにPIDを指定してkillを実行していましたが、 PIDではなくプロセス名を指定して、 該当するプロセスを一度に終了させる方法はあるでしょうか。 宜しくお願い致します。 OS:Fedora9

  • logoutしたとき消えるプロセスは誰が消してるの?

    telnetなどでログインして プロセスを動作させて、ログアウトすると 動作させていたプロセスが消えるのですが、 誰がそのプロセスにシグナルを送っているのでしょうか? OSはsolarisを使っています。 シェルが子供を消しているのかと思ったのですが、 以下の動作をみるとそうでないみたいで・・ telnet .... $ $sh $sleep 10000 & 1234(←sleepのPID) $kill [shのPID] $ ps -eo pid,ppid,args | grep 1234 1234 1 sleep 1000 $exit telnet .... $ $ ps -eo pid,ppid,args | grep 1234 $ない

  • killコマンドについてお教えください。

    solaris初心者です。 killコマンドで、 kill -TERM pidで終了できないプロセスについては kill -KILL pidで強制的に終了することができます。 と他の者に説明したら、どうして終了できないのが あるのですかと聞かれました。的確に回答できませんでしたので、よい説明方法等ありましたらお教えください。 あとkill -INT pidについてもお教えください。

  • シェルの変数の動作についての質問

    solaris8上で、シェルから別のシェルを子プロセスを動作させて その子プロセスが終了したかを判定するシェルを作成しました。 そのシェルの抜粋は下記のようになっています。 ---------------------------------------------------- "コマンド実行" & PID=$! i=0 ERR_FLG=1 echo " PID="$PID >> tmp.txt   ・・・・(1) while [ 1 ] do   if [ `ps -ef | grep $PID | grep -v grep | wc | awk '{print $1}'` -eq 0 ]; then     ERR_FLG=0     break   fi   "終了条件を満たしたかを確認するサブルーチン"   if [ $? -eq 1 ]; then     echo "Time out" >> tmp.txt     break   fi   i=`expr $i + 1 `   sleep 10 done echo `ps -ef | grep $PID | grep -v grep` >> tmp.txt ・・・・(2) ---------------------------------------------------- 殆どの場合問題なく動作しているのですが、 ごく稀に、(1)と(2)で取得した$PIDの値が異なるという現象が起きます。 当然サブルーチン上で、PIDを書換する処理もありません。 どのような状況の時に、現象が起きるかもはっきりしていません。 この現象の回避方法が判る方がおられましたら御教示の程、 宜しくお願いします。

  • 別サーバの実行ユーザの変更

    またシェルスクリプト初心者でっす 調べてみたものの今一つ見つけきれませんでした ボーンでの質問です サーバA上のシェルスクリプト(a.sh)からSSHでサーバBへログインし、 サーバB上のシェルスクリプト(b.sh)を実行させようと思い a.sh内に下記の記述を施しました ssh [ユーザ名]@[サーバ名] "su - ; sh [フルパス]b.sh" この記述を施したa.shをサーバA上で実行したところ standard in must be a tty と端末がないと表示され、実行ユーザが変更されませんでした いろいろ調べてsudoでやるといいという話があったので a.sh内のsuをsudo(-s)に変更して試したところ、 今度はパスワードを聞かれたのですが、パスワード入力がマスクされず、 パスワードを入力すると応答が返ってこなくなりました 質問としてはサーバBの実行ユーザを変更するにはどうすればよいか となります よろしくお願いいたします ※b.sh自体はshコマンドで実行はされます ただ、内部でプロセスをkillしようとするのですが、 そのプロセスのユーザかあるいはrootにならなければ killの権限がないのでkillできない状態となってしまい、 やりたいことが実現できない状態です

  • SIGTERMについて

    マルチプロセス処理で、 signal(SIGTERM,xxx) の処理を入れています。 プログラムを実行した後、コマンドラインから kill -TERM 親PID とたたき子プロセスまで殺すことはできるのですが、 これをコマンドラインではなく、 何かスクリプトを作成し、運用したいと思っています。 どなたかスクリプトの書き方をご教授頂けませんでしょうか。

  • BシェルとCシェル

    Solarisサーバの運用において、シェルでスクリプトを作成する場合、BシェルとCシェルでは、どちらが多く用いられているでしょうか?

  • プロセスの切り方

    質問です。 今会社(このカテゴリーをご覧になっていらっしゃる方でご存じの方が いると思いますが)でシェルを作成しているのですが、 時たまとんでもないミスをして、シェルが止まらなくなるときがあります。 その時即座に、ps-efでプロセス番号を割り出してkillしているのですが、 以前にミスったと思われるプロセスが残っていて困っています。 (実行時間が0:00となっているので、素人認識で大丈夫だと 思っているのですが、気になるのでkillで切ろうとすると所有者ではありません と言われてしまいます) どうすれば、こういったプロセスが切れるのかお教え下さい。

  • さくらインターネットのレンタルサーバーのOSはFreeBSDですが、

    さくらインターネットのレンタルサーバーのOSはFreeBSDですが、 たとえば、自サイトのCGIの負荷が高くなるとホームページが開かなくなります。 個人のページなので、強制的にプロセスを削除するスクリプトをperlやシェルスクリプトで書きたいのですが、どのように書けばよいでしょうか? topとすると、 PID USERNAME THR PRI NICE SIZE RES STATE C TIME WCPU COMMAND 23981 test 1 4 0 16180K 13144K select 0 0:00 0.00% perl5.8. これをスクリプトで削除する方法です。 人間が見ればCOMMANDがperl5.8.となっているので、これがcgiでPIDは23981なので kill -9 23981とすればよいのはわかりますが、 スクリプトで実行する方法が知りたいです。