system management
1748128 メンバー
3578 オンライン
108758 解決策
新規ポスト

親.cshから子.cshを切り離す方法

 
komu3
新しいメンバー

親.cshから子.cshを切り離す方法

お世話になっております。

親.cshから子.cshを呼び出し、親.cshが終了後も子.cshを実行後終了させたいのですが、子.cshの処理が終了してもプロンプトが戻ってきません。

戻る方法をお教え下さい。

<親.csh内、子.csh呼び出し方法>

nohup ~/hoge/子.csh &

<実行方法>

TeraTermから実行サーバにログインして手打ち

<状態>

親.csh終了後、プロンプトが戻ってくるが、子.csh内のコマンド(sleep&echoのみ)が正常終了してもプロンプトが戻ってこない("Ctrl+c"を押せば戻る)

<希望>

出来ればプロンプトを戻したい。

実環境ではcronに登録する予定なのですが、なぜプロセスが死んでもプロンプトが戻ってこないのか原因を知りたい。

以上、どうぞ宜しくお願い致します。
5件の返信5
hazelwood
信頼あるコントリビューター

親.cshから子.cshを切り離す方法

この呼び出し方法であれば、子.cshの状態に関わらず、親.cshは処理を継続するはずですが...

親側で、どこか他のところで止まっているということは無いでしょうか?

"csh -x 親.csh"でトレースを取ってみることをお勧めします。

#実はプロンプトが表示されているが、直後に子.cshからのメッセージが表示されるため、見落としているなんてことは無いですよね。

komu3
新しいメンバー

親.cshから子.cshを切り離す方法

ご返信ありがとうございます。

確かに、「子.cshの状態に関わらず、親.cshは処理を継続」し正常終了します。

ただ、行いたい要件としては、親は子をキックしたら子より早く終了してしまいます。

(必ず、親が正常終了した後に子を起動させたい為)

よって以下のテストshellを作成してテストした結果、子のプロセスが死んでもプロンプトが戻ってこないので、原因を知りたく思います。

以下にshellの中身と実行状態を記載しました。

(デバックモードにすると見辛かったので標準出力のみにしました)

<親shell>

$ cat test.csh

#! /bin/csh -f

echo "START:test.csh"

nohup /<絶対パス>/testSUB.csh &

echo "END :test.csh"

<子shell>

$ cat testSUB.csh

#! /bin/csh -f

sleep 10 #親より終了を遅くさせる

echo "START:testSUB.csh"

echo "END :testSUB.csh"

<処理実行>

$ ./test.csh

START:test.csh

9538

END :test.csh

$ START:testSUB.csh

END :testSUB.csh

# ここで'$'が戻ってこない

# プロセスNo.9538が消えていることは確認済

(現状"Ctrl+c"でプロンプトを戻している)

「$ START:testSUB.csh 」の箇所は、親が終了した時点で一度プロンプトが戻るが、子からのechoが表示された後は戻らないです。

また、子にsleepをかけず、親より早く終了すればプロンプトが戻ってくることは確認済。

プロンプトの戻し方、又は戻らない原因を知りたいです。

どうぞ宜しくお願い致します。
nt
貴重なコントリビューター

親.cshから子.cshを切り離す方法

> <処理実行>

> $ ./test.csh

> START:test.csh

> 9538

> END :test.csh

ここまでは test.csh の出力

> $ START:testSUB.csh

> END :testSUB.csh

'$' は login shell のプロンプト

その後のメッセージは testSUB.csh の出力

つまり login shell はプロンプトを書いて入力を待っている状態。そこに testSUB.csh がメッセージを

書いているだけ。

Ctrl-C でなくても retrun で次のプロンプトが表示されます。

また testSUB の出力をファイルに取れば普通にプロンプトが

表示されているのがわかります。

H_K
頻繁なアドバイザー

親.cshから子.cshを切り離す方法

まずログインシェルがいて、あなたが親と思っているのはログインシェルの子で、子と思っているのは孫です。

プロンプト$を表示しているのはログインシェルであり、ログインシェルでフォアグラウンド実行した ./test.csh が終了した時点で、

プロンプトを表示していますね。

プロンプトが表示された後、孫プロセスtestSUB.csh の表示が始まりますが、端末が同じなので、プロンプトの後ろに表示されています。

でもログインシェルはもうやることがないから、それ以上プロンプトを表示することはしません。

komu3
新しいメンバー

親.cshから子.cshを切り離す方法

hazelwood様、nt様、kinokino様

ご返信ありがとうございました。

とっても良く判りました。

判ってみれば、何でこんな簡単な事に何時間も・・とも思ってしまいますが、本当に判らず困っていました。

どうも有り難うございます。