こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

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

投稿日時 - 2008-09-26 11:21:28

QNo.4357609

困ってます

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

私も、同じようなシェルを実際に 稼動させておりますが
なかなか うまい方法は 見つからないようです。
→ 極めてオーソドックスに記述しています。

基本的な方針:
 私の場合は、面倒ではありすが プロセスIDをファイルに
 書き出して管理をしています。
 → もちろん、一つのシェルとして実現しています。

このシェルの位置付けですが、基幹系 業務サーバとして
絶対に落ちることが許されないサーバ上で動作します。

したがって、あらゆるエラー事象を想定し、かなり 慎重 かつ
厳密にシェルを書き上げています。

よって、出来上がったシェルは 300行からなります。

また、これとは 別のシェルとしては 同機能を実現させる為に
Solaris10 の SMF機能を用いたものもあります。

 1)XMLで記述した定義ファイル作成し、リポジトリに登録する。

 2)crontabでシェルを起動させ、その中で 『 svcadm disbale 』
   と 『 svcadm enable 』 を発行する。

いずれにしましても、巧妙 かつ “うまい方法” が見つかって
おりませんので、面倒ではありますが、セオリー通りに 【 地道 】
に書き上げました。

以上、参考となるような 巧妙な手段が提示できなくて大変に申し訳
ありませんが、barashさん と同様に 苦労をしております。

投稿日時 - 2008-09-29 04:50:12

お礼

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

投稿日時 - 2008-09-30 00:05:56

このQ&Aは役に立ちましたか?

5人が「このQ&Aが役に立った」と投票しています

回答(6)

ANo.5

多少面倒かもしれませんが下記のような方法はどうでしょうか?

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

投稿日時 - 2008-09-27 10:19:22

補足

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

投稿日時 - 2008-09-29 23:54:55

お礼

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

投稿日時 - 2008-09-30 00:00:17

ANo.4

あ、書き込んでから気がつきましたが、以下の方法では、
自分しかいないとき、自分を殺しちゃいますね・・・

そのときには、pkillしない、という条件分岐するとか。

投稿日時 - 2008-09-26 16:27:49

ANo.3

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

投稿日時 - 2008-09-26 16:26:07

お礼

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

投稿日時 - 2008-09-29 23:54:16

ANo.2

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

投稿日時 - 2008-09-26 12:50:24

お礼

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

投稿日時 - 2008-09-26 15:32:59

ANo.1

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

投稿日時 - 2008-09-26 11:47:44

お礼

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

投稿日時 - 2008-09-26 15:35:05

あなたにオススメの質問