🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

Q&A

解決済

1回答

373閲覧

autologin、autoboot scriptの実行(再)

Gammodler

総合スコア9

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

0グッド

0クリップ

投稿2019/10/24 08:54

前回表題の件をUPしたのですが、回答いただけず取り下げ処置を取りました。
要旨とするところは
linuxの起動時に2つのprogramを実行します。
autologin
autoboot
です。
前者はGOとなったが後者は無視される、
その理由として前者は*.cのprogramを、
後者は*.shを実行することに原因がある、つまりscriptを実行してくれない要因がある、その解決策を教えてほしい、というものでした。

実行過程で両者に干渉がある可能性が浮上しました。そこで前者を単なるwaitに変更してみました。
for(i=0;i <1000; i++) {}

なんとこれでautbootしてしまいました。
つまりscriptを実行しない何らかの要因があるというのは誤りらしいことが分かりました。
これでようやく自動的にlinux側programが立ち上がるようになりました。
そこで質問があります。
1.loginしないでlinux OSが使える、これは正しいのでしょうか?。
以前にもこの問題はありました。autologin,autboot両方の機能を動作させたつもりが、実際は前者の実行が遅れ(?)、後者が先行して動作状態に入ってしまったらしく前者は実行されていませんでした。
この事態に気が付かず数か月間使い続け、その間は特に動作に支障はありませんでした。
このような動作で発生が予想される問題はありますか?

2.もちろんloginなしの動作は回避したいです。
今回は幸い(?)autologinが先に実行されます。それがどのような理由に寄るのは把握できませんが。
ここで適切なシーケンスになる措置を行えばこの異常は解消できるのではないかと考えられます。
前者の*.cは以下です:

autologin.c: #include <unistd.h> #include <stdio.h> int main() { execlp( "login", "login", "-f", "root", 0); }

この後にwaitを入れるなどの措置がとれればいいのですが。
autologinのbinはひとつのprogramである必要があると思います。
modifyしたprogramをご教示願えれば幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

linuxの起動時に2つのprogramを実行します。
autologin
autoboot
です。
前者はGOとなったが後者は無視される、

2つのプログラムを実行する、とありますが、順番に実行しているのですよね。
autologinの方が中でexeclploginコマンドを実行しているのであれば、そのloginセッションが起動してしまうのであるから、logoutするまで戻ってこないかたちとなり、見た目、次のautobootが実行されていないように見えているのでは?と思います。

autobootに先行するプログラムautologinのコードでfor (i=0; i<1000...の空ループでOKなのは、autologinのプロセスが速やかに終わり、次のautobootがすぐに実行されているからだと思います。

1.loginしないでlinux OSが使える、これは正しいのでしょうか?。

使える、と言うことがユーザー(人間)が使えることを想定した話なのであれば、ログインしなくても別に間違いではありません。ログインとはこの場合、ユーザーがターミナルを介してシェルを起動することを指します。loginコマンドを使わなければ、シェルをそのまま使う状況になるでしょう。組み込みlinuxなどではinittabファイルを修正して、ログインプロンプトすら出さないようにすることもありますし、linuxが最初に必ず起動するinitプロセスからrc.*らの起動スクリプトを経て、rootユーザーとデーモンプロセスだけで運用することもざらです。SUIDやSGIDを使えば、あらかじめ作成したユーザーやグループの権限でプログラムを起動することもできます。

2.もちろんloginなしの動作は回避したいです。

一般的には、inittabファイルでgettyなどのターミナルが起動するように設定するのでは?と思います。シリアルコンソール専用などとする場合もありますが。busyboxなどを使われているのであれば、細かい部分で違いはあるかもしれませんが、概ね同じ状況だと思います。

投稿2019/10/24 10:13

dodox86

総合スコア9256

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Gammodler

2019/10/24 11:44

dodox86様 早速の回答ありがとうございます。 autologinすると/home/usrでcommand待ちの状態になります。 このとき次のmystartup.shの起動を期待しているのですが、これは実行されないようです。 その内容:  #!/bin/sh  mount /dev/mmcblk0p1 /mnt  /mnt/startup.sh です。starup.shは実行されません。 Target側ではautologinおよびmystartup.shは/etc/以下に下記のように格納されています: /etc/rc5.d#: /etc/init.d/autologin lrwxrwxrwx 1 root root 21 Oct 21 2019 S99mystartup -> /etc/init.d/mystartup    ← 望ましくないゴミ lrwxrwxrwx 1 root root 24 Oct 21 2019 S99mystartup.sh -> /etc/init.d/mystartup.sh /etc/init.d#: -rwxr-xr-x 1 root root 2912 Oct 21 2019 autologin root root 55 Oct 21 2019 mystartup.sh busyboxは使っていません。 mystartup.shは実行開始で無限Loopに飛び込んでしまいますが、autologinの方は実行を一瞬で終了、次のScript開始のcommandを発行してくれることを期待していたのですが、何かの状態に移行しているらしいです。 loginという手続きを経ないでlinuxを含めたシステムを動作させることはざらにあること、と伺い安心しました。 gettyなどターミナルの件、研究いたします。 問題の一つが解決しました。 ありがとうございました。
dodox86

2019/10/24 12:10

もしかしたらまだ質問と回答の間で内容の取り違いがあるのかもしれませんが: > autologinすると/home/usrでcommand待ちの状態になります。 $ や # がプロンプトとして表示されている状態ですよね?それがログインセッション(シェル)の状態です。それも一つのプロセス実行中の状態なので、それが終わる(logout)するまでは次に進まないと思います。(回答ではそれを言っています) loginセッションの中でmystartup.sh を別途実行したいのであれば、別の工夫がいると思います。loginコマンドの動作を念頭に置いてみてください。 https://linuxjm.osdn.jp/html/shadow/man1/login.1.html
dodox86

2019/10/24 12:17

簡単に書くと、linuxはrc.*などの起動スクリプト実行のあと、inittabの指定にしたがい、getty、mingettyなどのターミナル起動の受け口をもって待機しています。ユーザーがコンソールなどを開くとその受け口のひとつが接続され、"login:"と表示され、シェルに入っていきます。複数のターミナルでログインができるのはそのメカニズムのおかげです。
Gammodler

2019/10/25 03:27

dodox86様 そうですね、私も意味を取り違えていることに気が付きました。 そもシェルというものに基本的理解を欠いていることに気が付きました。 tty、inittabなど、解決の方向を示していただいていますが、結果が出たところで別スレッドで報告いたします。 重ねてのコメント、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問