Armadilloフォーラム

起動スクリプト(rc.local)の編集について

rookie

2014年3月18日 20時41分

お世話になります。

起動スクリプトについて2点ほど伺いたいのですが、

1)
起動スクリプト(rc.local)に自作したプログラムが自動起動するように記述して、
再起動させると自動起動するようにはなるのですが、
コマンドラインでctrl + c でプログラムを中断することができません。
なぜでしょうか?

2)
起動スクリプトを編集したいのですが、
自動起動したプログラムを中断できないため編集するこができません。
そこで、元に戻すためarmadilloのカーネルを書き換えたのですが、
自作プログラムが起動してしまいます。
起動スクリプトが書き換えられていないようです。
どうしたら元に戻せるようになるでしょうか?

コメント

中村です。

もっと上手に説明ができる人がいるかもしれませんが・・・

rc.localで起動されたプログラムと、コマンドラインでCTRL+Cを入力する
端末とは関連付けられていません。
なので、端末からそのプログラムにSIGINTが届かないのです。

rc.localから起動されたプログラムを停止させるには、
ログイン端末でpsコマンドを実行してそのプログラムのプロセスIDを調べ、
そのプロセスをkillします。

実際にどうやるかは、ネット上にたくさん解説がありますから、
上に出てきたキーワードで検索してみてください。

--
なかむら

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

コメントありがとうございます。

確かに、終了させたいプロセスを調べてkillしたいところですが、
自作プログラムの実行中は、端末がコマンドを受付けない状態となっております。

起動スクリプトを編集する前の状態(デフォルト)に戻すことはできないでしょうか?
例えば、TFTPでrc.localを書き換えるとか。

> 中村です。
>
> もっと上手に説明ができる人がいるかもしれませんが・・・
>
> rc.localで起動されたプログラムと、コマンドラインでCTRL+Cを入力する
> 端末とは関連付けられていません。
> なので、端末からそのプログラムにSIGINTが届かないのです。
>
> rc.localから起動されたプログラムを停止させるには、
> ログイン端末でpsコマンドを実行してそのプログラムのプロセスIDを調べ、
> そのプロセスをkillします。
>
> 実際にどうやるかは、ネット上にたくさん解説がありますから、
> 上に出てきたキーワードで検索してみてください。
>
> --
> なかむら
>

at_takuya.sasaki

2014年3月19日 12時14分

佐々木です。

Armadillo-840の標準イメージでしたら、TeraTermなどを使い、
telnetでguestユーザでログインして、suでrootユーザになってから、
psとkillを使ってはどうでしょう?

ただし、IPアドレスがわからないと入れませんが…

/etc/config領域を出荷時の状態に初期化してもよければ、
フラッシュメモリ書換ツールのHermit-atを使って、
config領域をeraseする方法があるかと思います。
(以下、400シリーズのドキュメントですが、参考まで)
http://manual.atmark-techno.com/armadillo-4x0/armadillo-400_series_soft…

ちなみに自前のプログラムをrc.localに書く際には、&をつけてバックグラウンドプロセスにしたほうが
よいと思います。
こちらも参考URL記載しておきます。
http://manual.atmark-techno.com/armadillo-guide/armadillo-guide-2_ja-2…

> お世話になっております。
>
> コメントありがとうございます。
>
> 確かに、終了させたいプロセスを調べてkillしたいところですが、
> 自作プログラムの実行中は、端末がコマンドを受付けない状態となっております。
>
> 起動スクリプトを編集する前の状態(デフォルト)に戻すことはできないでしょうか?
> 例えば、TFTPでrc.localを書き換えるとか。
>
> > 中村です。
> >
> > もっと上手に説明ができる人がいるかもしれませんが・・・
> >
> > rc.localで起動されたプログラムと、コマンドラインでCTRL+Cを入力する
> > 端末とは関連付けられていません。
> > なので、端末からそのプログラムにSIGINTが届かないのです。
> >
> > rc.localから起動されたプログラムを停止させるには、
> > ログイン端末でpsコマンドを実行してそのプログラムのプロセスIDを調べ、
> > そのプロセスをkillします。
> >
> > 実際にどうやるかは、ネット上にたくさん解説がありますから、
> > 上に出てきたキーワードで検索してみてください。
> >
> > --
> > なかむら
> >

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

作業用PCからtelnetでリモートログインして、
rc.localを編集することができました。
ご丁寧に教えていただきありがとうございました。

今後、自作プログラムはバックグラウンドで実行させるように致します。

> 佐々木です。
>
> Armadillo-840の標準イメージでしたら、TeraTermなどを使い、
> telnetでguestユーザでログインして、suでrootユーザになってから、
> psとkillを使ってはどうでしょう?
>
> ただし、IPアドレスがわからないと入れませんが…
>
> /etc/config領域を出荷時の状態に初期化してもよければ、
> フラッシュメモリ書換ツールのHermit-atを使って、
> config領域をeraseする方法があるかと思います。
> (以下、400シリーズのドキュメントですが、参考まで)
> http://manual.atmark-techno.com/armadillo-4x0/armadillo-400_series_soft…
>
> ちなみに自前のプログラムをrc.localに書く際には、&をつけてバックグラウンドプロセスにしたほうが
> よいと思います。
> こちらも参考URL記載しておきます。
> http://manual.atmark-techno.com/armadillo-guide/armadillo-guide-2_ja-2…
>
> > お世話になっております。
> >
> > コメントありがとうございます。
> >
> > 確かに、終了させたいプロセスを調べてkillしたいところですが、
> > 自作プログラムの実行中は、端末がコマンドを受付けない状態となっております。
> >
> > 起動スクリプトを編集する前の状態(デフォルト)に戻すことはできないでしょうか?
> > 例えば、TFTPでrc.localを書き換えるとか。
> >
> > > 中村です。
> > >
> > > もっと上手に説明ができる人がいるかもしれませんが・・・
> > >
> > > rc.localで起動されたプログラムと、コマンドラインでCTRL+Cを入力する
> > > 端末とは関連付けられていません。
> > > なので、端末からそのプログラムにSIGINTが届かないのです。
> > >
> > > rc.localから起動されたプログラムを停止させるには、
> > > ログイン端末でpsコマンドを実行してそのプログラムのプロセスIDを調べ、
> > > そのプロセスをkillします。
> > >
> > > 実際にどうやるかは、ネット上にたくさん解説がありますから、
> > > 上に出てきたキーワードで検索してみてください。
> > >
> > > --
> > > なかむら
> > >

中村です。

佐々木さんとのやり取りをみていて、状況が今頃わかりました。

後からこれを読んだ人のために・・・、というか、
自分があとでこれを読み返したときのために・・・でもあるのですが、
付け加えておきます。

最初の質問メールで「CTRL+Cできない」とあり、そのお返事として私が
> > > > rc.localで起動されたプログラムと、コマンドラインでCTRL+Cを入力する
> > > > 端末とは関連付けられていません。
> > > > なので、端末からそのプログラムにSIGINTが届かないのです。

と書きましたが、これ、違ってましたね。

> > > 確かに、終了させたいプロセスを調べてkillしたいところですが、
> > > 自作プログラムの実行中は、端末がコマンドを受付けない状態となっております。

rc.localから起動したプログラムが制御を返していない(バックグラウンド化していない)ために、
rc.localが終了せずgettyが動いていなくて、端末からログインできない状態だったのですね。
CTRL-CによるSIGINTがそのプログラムに届くとかいう以前の問題でした。

--
なかむら

> 最初の質問メールで「CTRL+Cできない」とあり、そのお返事として私が
> > > > > rc.localで起動されたプログラムと、コマンドラインでCTRL+Cを入力する
> > > > > 端末とは関連付けられていません。
> > > > > なので、端末からそのプログラムにSIGINTが届かないのです。
>
> と書きましたが、これ、違ってましたね。

今回の質問とは違いますが、書かれていることはあっていると思います。

sysv init などの boot script は、起動時に SIGINT を渡すことができるよう
に実装されていることが多いです。ただ、組み込み機器の場合、確実に起動し
てほしいので、2009年に挙動を変更しました。

/etc/init.d/rc の最初で、いくつかのシグナルを止めています。

中村です。

元の質問の内容からそれますが・・・

> sysv init などの boot script は、起動時に SIGINT を渡すことができるよう
> に実装されていることが多いです。ただ、組み込み機器の場合、確実に起動し
> てほしいので、2009年に挙動を変更しました。
>
> /etc/init.d/rc の最初で、いくつかのシグナルを止めています。

/etc/config/rc.localに"ping localhost"と書いて試したら、
CTRL-Cでpingが止まっちゃいました。
pingが止まったあとに"login:"が表示されます(←これは正しい)。

trap ":" INT QUIT TSTP
となってますけど、これだとシグナル無視じゃなくて
シグナルをトラップ(処理)して":"を実行することになりませんか?
(何もしないコマンド":"を実行する)

trap "" INT QUIT TSTP
とすれば(trapの第一引数を空文字列にする)、
rcではSIGINTは無視されると(止まらない)思います。
(だったような・・・)

ですが・・・rcから起動された子プロセスはそのシグナルで止まるのかな。
どっちを書いてもCTRL-Cでpingは止まってしまいました。
sleepは、":"だと止まりましたが""では止まりませんでした。

--
なかむら

なかむらさん、

確認がありがとうございます。

たしかに空文字じゃないと内部的に「無視」ではないですね。

今の実装では、
- 起動スクリプト自体は「なにもしない」
- 起動スプリプトから実行されるコマンドは、親から signal mask を継承す
るので、デフォルトでは無視しない

という実装でした。

そうなると、中村さんとテストと現在の挙動は一致するのですが、rookie さん
が確認した挙動とは違う感じです...。