• ベストアンサー

シェルスクリプトの中であるプログラムにシグナルを送りたいとき

こんにちわ, 今シェルスクリプトの学習をしています。 シェルスクリプトのなかであるプログラムにSIGINTを送るシェルスクリプトを作るにはどうすればいいでしょうか。 たとえば, ./hogeというCプログラムがあり,その中でsignal関数を用いてSIGINTを捕らえるようなプログラムがなされているとき, シェルスクリプトで #!/bin/sh ./hoge & PID=$$ sleep 2 kill SIGINT $PID だと,$$にはこのシェル自体のPIDが返ってきているので,うまくいきません。 なんとか,./hogeをうごかし,その後何秒かあとにSIGNALを送るようなシェルスクリプトを作りたいのですが,どうすればいいでしょうか。 Cでforkさせて外部呼出しによって送るしかないのでしょうか。 よろしくお願いします。

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

  • ベストアンサー
  • you-m
  • ベストアンサー率58% (190/327)
回答No.4

No2のtatsu99さんが書かれている通り、「$!」でバックグラウンド実行したプロセスのプロセスIDが取得できます。 ただし、これはBシェル(/bin/sh)の標準的な仕様であり、Linuxに限らずBシェルの動く環境であれば、ほぼ例外なく使える機能です。 もちろん、bashのようなBシェルの上位互換シェルでもつかえます。 ちなみに、このような特殊変数には他に、 $? 直前のコマンドの終了ステータス $$ 実行中のシェルスクリプトのPID $- Bシェルを制御するフラグの状態 などがあり、シェルスクリプトを使う際には非常に役に立ちます。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.3

No2です。 Linuxの場合は、$!が直前にバックグラウンドで実行したプロセスIDになります。 PID=$! として確認してみてください。

全文を見る
すると、全ての回答が全文表示されます。
  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.2

基本的には以下の方法をとります。 1.PSコマンドを実行する。 2.その結果からhogeのプログラムの行をピックアップする。 3.その行のプロセスIDを取得する。 PSによって表示される内容がOSによって若干異なりますので、どのOSで動作させるのかも提示されると、さらによい回答が得られると思います。

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

私はシェルスクリプトに関してはよく知らないので、 参考になりそうなURLだけ紹介しておきます。 # 「じゃあ、コメントするな」というご指摘、覚悟してます ぱっとみたかんじだと、yu393939さんが望んでいる処理をできそうな感じがします。 お目汚し、失礼。

参考URL:
http://www.nishimoto-site.net/archiver/fj/unix/200101/msg00018.html
全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • シェルスクリプト trap処理の流れにつきまして

    シェルスクリプト作成しておりますが、 trap処理について質問がありますので、ご教授お願い致します。 以下、テストしたいと思っているスクリプトを記載いたします。 #!/bin/sh trap "echo 'stopped'" 1 2 3 15 echo start > test1.txt sleep 100 echo end > test1.txt 上記スクリプトを実行し、Ctrl+cもしくは、 kill -15 でスクリプトを削除した場合、 sleep中にスクリプト中断していると思うのですが、 end文字列がtest1.txtに書き込まれてしまいます。 trapが処理される流れというのは、どのような流れなのでしょうか。 また途中で中断しているのであれば、途中で以下処理を 行なわないようにするにはどうすればよろしいでしょうか。 宜しくお願いいたします。

  • シェルスクリプトで困っています 2

    度々申し訳ございません。 現在、Linuxマシン1からLinuxマシン2へTelnetでログインし、Linuxマシン2上にあるシェルスクリプト(/bin/sh)を実行し、Linuxマシン2上のプログラムを実行した後、Linuxマシン2からログアウトするシェルスクリプトを作成中です。 その、Linuxマシン2からログアウトする際に、 "exit"を記述しているのですが、その"exit"がTelnetログアウトの意味で実行されず、シェルスクリプトを終了するの意味で実行されていて困っています。 どなたか上手くTelnetからログアウトできるようにシェルスクリプトを組む方法をご存知ではないでしょうか?もし判りましたらご教授下さい。 よろしくお願い致します。

  • シェルスクリプトで #!/bin/sh ってどうゆ

    シェルスクリプトで #!/bin/sh ってどうゆう意味ですか?

  • PHP シェルスクリプト 引数

    失礼します。現在PHPからシェルスクリプトを引数を付けて実行し、戻り値で確認が出来るか試しているのですがなかなか参考になる記事がなく実現が出来ない状態です 調べたところ、 phpからhoge.shというシェルファイルをargという引数で実行したいとします。 引数を"'. .'"で囲う事で、引数を渡せるようです。 $output = shell_exec('/bin/sh /path/to/hoge.sh "'.$arg.'"') var_dump($output) 上記のような記事を見つけたのですがhoge.shはどのように$argを受け取り、戻り値を渡しているのでしょうか?また、$argの値の中身は渡す引数の内容という認識で正しいのでしょうか?サンプルコードなどがあるとうれしいです。 ご教授よろしくお願い致します。

  • シェルスクリプト 引数の引渡しについて

    こんにちは。現在シェルスクリプトを勉強中なのですがどうしてもわからないことがあり投稿させていただきました。 シェルスクリプトにて作成した引数(引数にスペースがある場合)を別のシェルスクリプトへ渡そうとしたときにうまく引き渡せなくて困っています。 詳しくは以下のスクリプト参照願います。 (1)引数作成のスクリプト _/_/_/_/_/_/_/_/_/_/_/_/ #!/bin/sh a="HELLO" b="\"WOW WOW\"" test.sh $a $b _/_/_/_/_/_/_/_/_/_/_/_/ (2)test.sh _/_/_/_/_/_/_/_/_/_/_/_/ #!/bin/sh echo $1 echo $2 echo $3 _/_/_/_/_/_/_/_/_/_/_/_/ これを実行すると $1=HELLO $2="WOW $3=WOW" となってしまいます。 これを $1=HELLO $2=WOW WOW $3=NULL(空欄) となるようにシェルスクリプトで作成することはできないのでしょうか? ご教授よろしくお願いします。 よろしくお願いします。

  • シェルスクリプト コマンドを変数にした時の呼び方

    はじめまして、シェルスクリプトを勉強中の者です。 コマンドを変数にいれて、まとめました。 しかしコマンドの変数を呼びこもうとするとエラーになります。 ============================================ #!/bin/sh GREP="grep" cat "${GREP} '^[0-9]' /home/hoge/test.nicdf" ============================================ ================ シェル実行結果 ============= $ ./test.sh cat: grep '^[0-9]' /home/hoge/test.nicdf: そのようなファイルやディレクトリはありません どう書けば、エラーにならずに正常に動作するでしょうか? ご教授の程よろしくお願いします。

  • シェル??? スクリプト???

    この業界で仕事していていつも首をかしげてしまうことなんですけど、、、 シェルスクリプトのことを単に『シェル』と呼ぶ人がとても多いのですが、この表現はなんだか気持ち悪くありませんか? たとえば、『ちょっとシェル作って』なんて言いますけど、なんかシェル本体(/bin/shそのものとか)を作れといわれてるみたいで変な感じです。 これについて、みなさんどう思われますか? また、なぜこういう言い方が一般化したのでしょうか?(自分の会社だけかと思ってたら、委託さんや協力会社などの同業他社の方も使っているので。。。) くだらない質問ですがよろしくお願いします。

  • telnet 110 のシェルスクリプトについて

    linux初心者です。 telnet localhost 110 の確認スクリプトを作成したいのですが、調べた結果以下のスクリプトを作成しましたがうまく動作してくれません。 お分かりになる方ご教授ください。 test.sh #!/bin/bash sleep 1; echo user $1 sleep 1; echo pass $2 sleep 1; echo stat sleep 1; echo quit test1.sh #!/bin/bash sh ./test.sh | telnet localhost 110 ./test1.sh hogeuser hogepass 同じアカウントの場合$1 $2の部分にuser名 パスワードを記入すればいいのは分かるのですが、毎回アカウント・パスワードが違うため引数に渡したいと思います。 よろしくお願いいたします。

  • シェルスクリプト trap処理につきまして

    シェルスクリプトを作成しておりますが、 正常に動作しないので、ご教授いただけますでしょうか。 以下、作成したスクリプトを記載いたします。 #!/bin/sh trap "echo 'stopped'" 1 2 3 15 echo start sleep 10 echo end 上記のようなスクリプトを作成し、trap処理のテストを 行いたいのですが、上記スクリプト実行中で 「Ctrl+C」を押して、処理を止めても trap処理の「stopped」が表示されません。 スクリプトが処理が終わり、 コマンド入力できるようになったところで、「Ctrl+C」を押すと 「stopped」が表示されます。 スクリプト内で処理を止めた場合に「stopped」を表示させることが出来ず、困っております。 どなたかご教授いただけますでしょうか。 宜しくお願い致します。

  • シェルスクリプトの正規表現

    こんばんは。 CentOSでサービスを再起動しようと思ったのですが、資料に書いてある 通りにスクリプトを作っても動きません(起動はできるけど 再起動、停止ができない)。 仕方がないのでプロセスをkillしたあとスクリプトを起動して再起動 する方法を取ろうとしていますが、最後の1歩で詰まりました。 echoでps -axをした結果を変数に入れて先頭の数字(PID)だけを 切り出そうとするのですが、プロセスIDが、空白+PID4桁の時と 空白なしPID5桁のときとあるので上手くHitさせることが出来ません。 mofu=`ps -ax|grep qmail-send` 4桁) mohe=`expr "$mofu" : \(^\s[0-9]*\)'` 5桁) mohe=`expr "$mofu" : \([0-9]*\)'` kill $mohe /etc/rc.d/init.d/qmail シェルスクリプトで自動化したいので、PIDの桁数に関係なく確実に killしたいです。 上手い方法があったら御教授下さい。 よろしくお願いします。

このQ&Aのポイント
  • 10代の乾燥肌におすすめのスキンケア方法をご紹介します。
  • 日常生活や食生活に気をつけることで改善できる乾燥肌のケア方法を解説します。
  • 低コストでできるスキンケアアイテムもご紹介します。
回答を見る