• ベストアンサー

シェルのプロセスを止めて再度同じシェルを動かすことは可能でしょうか?

cronでシェルを定期的に動かし、前日に既に動いている自分のプロセスを止めて新たに動かすということをシェルの中でやりたいのですが、プロセスをPSで検索すると以前のプロセスと新たに動いたプロセスの両方をkillしてしまい実現できません。 何かよい方法があれば教えてください。 よろしくお願いします。

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

  • ベストアンサー
noname#73585
noname#73585
回答No.6

私も、同じようなシェルを実際に 稼動させておりますが なかなか うまい方法は 見つからないようです。 → 極めてオーソドックスに記述しています。 基本的な方針:  私の場合は、面倒ではありすが プロセスIDをファイルに  書き出して管理をしています。  → もちろん、一つのシェルとして実現しています。 このシェルの位置付けですが、基幹系 業務サーバとして 絶対に落ちることが許されないサーバ上で動作します。 したがって、あらゆるエラー事象を想定し、かなり 慎重 かつ 厳密にシェルを書き上げています。 よって、出来上がったシェルは 300行からなります。 また、これとは 別のシェルとしては 同機能を実現させる為に Solaris10 の SMF機能を用いたものもあります。  1)XMLで記述した定義ファイル作成し、リポジトリに登録する。  2)crontabでシェルを起動させ、その中で 『 svcadm disbale 』    と 『 svcadm enable 』 を発行する。 いずれにしましても、巧妙 かつ “うまい方法” が見つかって おりませんので、面倒ではありますが、セオリー通りに 【 地道 】 に書き上げました。 以上、参考となるような 巧妙な手段が提示できなくて大変に申し訳 ありませんが、barashさん と同様に 苦労をしております。

barash
質問者

お礼

ご回答ありがとうございました。 詳細な説明恐れ入ります。 とても、参考になります。

その他の回答 (5)

  • Lean
  • ベストアンサー率72% (435/603)
回答No.5

多少面倒かもしれませんが下記のような方法はどうでしょうか? sh(bourne shell)、csh共にシェルスクリプト内では$$でプロセスIDが取得出来るのでそれをファイル(ファイル名固定)に書き出す処理、終了時(正常終了時、異常終了時共に)プロセスIDが入ったファイルを削除する処理を追加。 さらにプロセスIDをファイルに書き出す処理の前にプロセスIDが書き込まれたファイルの存在の有無で前に起動したプロセスが存在するかチェックし、プロセスが存在するならファイル内に書かれているプロセスIDを使用してkillを実行し、新たに自分のプロセスIDをファイルに上書きで書き出す事にする。 プロセスIDが書かれたファイルが存在する場合、そのプロセスIDのプロセスが実際に存在するか確認してもいいかもしれませんが。

barash
質問者

お礼

申し訳ありません。 誤って補足部分にお礼を書いてしまいました。

barash
質問者

補足

ご回答ありがとうございました。 このやり方が今回自分のやりたいこと実現するの 簡単でチェックがしやすと思います。 参考になりました。

  • dyna_1550
  • ベストアンサー率34% (122/353)
回答No.4

あ、書き込んでから気がつきましたが、以下の方法では、 自分しかいないとき、自分を殺しちゃいますね・・・ そのときには、pkillしない、という条件分岐するとか。

  • dyna_1550
  • ベストアンサー率34% (122/353)
回答No.3

pgrep に -o オプションをつけて pkill するとか。

barash
質問者

お礼

ご回答ありがとうございました。 pgrepコマンドの存在は知りませんでした。試しみます。

回答No.2

cronから呼ばれるスクリプトと、そこから & で呼び出されて動作し続けるスクリプトの2つに分けるとか。

barash
質問者

お礼

ご回答ありがとうございます。 自分もその方法は思いついたのですが、なるべく1つのシェルで動作させたいと思っていましたので質問しました。説明不足で申し訳ありませんでした。

noname#96023
noname#96023
回答No.1

プロセス番号で区別するとか 止めるシェルと、動かしているシェルを2つに分けるとか

barash
質問者

お礼

ご回答ありがとうございました。 プロセスIDをファイルに取得してそのプロセスのみをkillするといった感じで試してみます。

関連するQ&A