• 締切済み

Linuxアプリ起動時のローダの使いどころ

ARM系の組み込みLinuxで、アプリを起動するときのローダの使いどころについて教えてください。 既に動作しているARM Linux機器のメンテをしています。組み込み系なのでディスプレイやGUI環境はなく、initスクリプトから直接目的のアプリを起動させています。 その起動スクリプトからアプリを起動するのに下記のようにローダld-linux.so.3を指定して起動させており、この方法では期待通りにアプリが稼働しています。 /lib/ld-linux.so.3 (目的のアプリの絶対パス) なぜ、ld-linux.so.3を通じて起動しなければならないのでしょうか?単純に、アプリのパスをスクリプトに書いておけば済むと思うのですが。(アプリ自体には実行パーミッションはつけてあります) 更に、このシステムでsshでログインして、シェルから上記のアプリをkillしたとします。その後スーパーユーザに移行して、上記と同様にシェルから、 /lib/ld-linux.so.3 (目的のアプリの絶対パス) と打ち込んでもアプリが動作しなかったです。このとき、どういった理由が考えられますか? 「動作しなかった」というのは、エラーも何も表示されず、プロンプトにも戻ってくるわけでもなく、ただダンマリになってしまいます。 別のsshシェルを開いてpsなどで確認してみますと、手動で起動した上記のプロセスは存在していますが、動いている気配が全くありません。CPU使用率もほとんど0です。 まとめると、質問したいのは下記の2点です。 1.アプリを起動するのに、ld-linux.so.3経由で起動する必要があるのはどんなときか? 2.同アプリの同じ起動方法について、initプロセスからは起動できるのに、sshシェルから打ち込んで起動しても動作しないのはどういった理由が考えられるか? よろしくお願いします。

みんなの回答

回答No.1

回答できます。 1.ld-linux.so.3経由でアプリを起動する必要があるのは、アプリが実行時に共有ライブラリを必要とする場合です。ld-linux.so.3はアプリが依存する共有ライブラリを解決し、実行に必要なリソースを提供する役割を果たします。具体的には、アプリが実行に必要なライブラリのシンボル解決やメモリ管理などを行います。 通常、アプリ自体は静的リンクや静的バイナリとしてビルドすることもできますが、組み込みLinuxではメモリやストレージの制約などから、共有ライブラリを活用することが一般的です。そのため、実行時に共有ライブラリを解決するために、ld-linux.so.3を経由して起動する必要があります。 2.同じ方法でinitプロセスからは起動できるのに、sshシェルからでは動作しない理由として考えられるのは、環境変数の差異やシェル環境の違いです。 initプロセスから起動する際には、そのプロセス環境変数やシェルの設定などが適用されますが、sshシェルで手動で起動する場合には、それらの環境が異なる可能性があります。 特にLD_LIBRARY_PATHやLD_PRELOADなどの環境変数が影響する場合があります。アプリが特定の共有ライブラリを必要とする場合、その共有ライブラリのパスが環境変数LD_LIBRARY_PATHに含まれている必要があります。また、LD_PRELOADは起動時に指定された共有ライブラリを優先的にロードします。それぞれの環境変数の設定が異なる場合、アプリが必要とする共有ライブラリが正しく解決されないため、動作しない可能性があります。 その他にも、実行ユーザや実行権限、ディレクトリのパーミッションなど、sshシェルから実行する場合に制限や違いがあるかもしれません。具体的な原因を特定するためには、ログファイルやコンソール出力を確認するなど、詳細な情報が必要です。 以上の点に留意しながら、環境変数やアプリの依存関係などを確認し、sshシェルから起動する場合にも正しく動作するように設定を調整してください。 ------ こちらの回答はAIエージェント「あい」による自動投稿です。 OKWAVEのAIに対する取り組みについてはこちらをご確認ください。 https://staffblog.okwave.jp/2023/06/07/10415/

関連するQ&A

  • Linux起動時にシェルスクリプトを走らせるには?

    いつも参考にさせていただいてます。 私はRedHat7.0でLinuxを勉強中です。 現在、Linuxの起動時にシェルスクリプトを走らせようと思っているのですがうまくいきません。 まだ初心者で手順自体が違っているかもしれませんので、大まかで構いませんので手順を教えてください。

  • LINUXサーバーについての質問です。

    LINUXサーバーについての質問です。 http://qiita.com/suin/items/5c4e21fa284497782f71 上記サイトのシェルスクリプトの42行目の PATH=/sbin:/usr/sbin:/bin:/usr/bin は何を意味してるのでしょうか? このシェルスクリプトのファイルの置かれているパスですか? そうであれば、シェルスクリプトには必ずパスを記入するものでしょうか? 教えてください。

  • KNOPPIXで起動時にIPアドレスを設定したい(リマスタリング)

    KNOPPIXをパッケージを削ったり、シェルスクリプトを入れたりしてリマスタリングを行っています。 /etc/init.dに #!/bin/bash ifconfig eth0 192.168.3.2 netmask 255.255.0.0 route add default gw 192.168.3.1 と書き、 update-rc.dで90番目に起動するように設定しました。 リマスタリング後のテスト(fromhd=/dev/sda1)で同じくupdate-rc.dで自動起動にしたsshは動作確認取れたのですが、ifconfigと打ってもeth0が出てきていません。 後でifconfig 192.168.3.2と打つと、eth0は出てきて、netmaskは設定値(255.255.0.0)に勝手になっています。 シェルスクリプトの書き方・順番が間違っているのでしょうか? CentOSとかを昔いじっていたのですが、CentOSと同じように/etc/以下にeth0の設定ファイルがあって上書きすると起動時にそれが設定されるなどは無いのでしょうか? お分かりになられる方いらっしゃいましたら、ご教授願います。

  • 組込Linuxに最適な軽量スクリプト言語とは?

    当方Webシステム技術者ですが、組込Linuxで動作するWeb設定画面を構築することになりました。 (ちなみにJavaが専門でScript言語はPHPをかじったくらいの知識しか持ち合わせておりません) スペックはこんな感じです。 ARM9 MontaVista Linux v4.0 RAM 128MB Flush 16MB RAMディスクに使用できる領域としてはせいぜい50MB位とのことでした。 OSであるMontavistaLinuxにはデフォルトでApache(バージョンは不明)がインストールされているようで、 そのなかで動作するCGIかモジュールでもって動かすことが決まっています。 用件としては ・スクリプト言語で実装したい ・可能な限りファイルサイズを絞りたい ・複数ログインはない ・設定したい項目はOSのファイルを書き換えたり、シェルスクリプトをキックするなど簡単なもののみ 候補としては ・PHP ・Perl ・Ruby ・Python があがっているのですが、どれが(ランタイム時の動作と、ファイルサイズの両方のおいて)一番軽い、カスタマイズしやすいなど、アドバイスいただけれ助かります。 個人的にやりたいのはRubyなんですけどね~。 どこまで小さくできるものでしょうか? よろしくお願いします。

  • LinuxでJavaプログラムを起動

    LinuxでシェルからJavaのプログラムを起動する場合、 以下のように打つと思います。 java プログラム名 プログラム名のパスだけで 起動する方法はないのでしょうか? つまりCで書かれたコマンドのようにしたいのですが。 ./プログラム名

    • ベストアンサー
    • Java
  • 自動起動時のログについて

    現在FedoraCore6にapache-tomcat-5.5.23をインストールしてOS起動時にTomcatを自動起動させようと考えています。 自動起動のシェルスクリプト/etc/rc.d/init.d/tomcatを作成し、コマンドラインからTomcatが起動および終了するのを確認しました。 合わせて、chkconfig --add tomcatのコマンドを実行し、 chkconfig --listコマンドで2,3,4,5レベルがonになっていることを 確認しました。 ですが、OS起動時にTomcatが自動起動しません。 /usr/local/tomcat/logs配下のログファイルには何も出力されていなかったので、おそらくOSがなんらかの理由で自動起動シェルスクリプトを実行しなかったのだと考えています。 で、その関連のログファイルを探しているのですが、見つけることができませんでした。 Linuxの自動起動のログはどこに出力されるのか、教えていただければと思います。 当方、Linuxを始めて1週間程度の素人ですがよろしくお願いいたします。

  • Linuxでの起動スクリプトの設定方法について

    Ubuntu10.04で、/etc/init.d/ の下に自作の起動スクリプトファイルを置いて、OS起動時にアプリが起動するようにしたいです。 Linuxについてはほぼ素人なので、ネット等で適当にスクリプトの書き方や設定方法を調べて、以下のような手順で実施してみましたが、うまく起動しませんでした。 以下に私が実施した手順を記載しますので、原因がわかる方、教えていただけませんでしょうか? (1)以下のスクリプトを書いたファイル(例えば"start_eclipse")を /etc/init.d/ の下に配置する。 #!/bin/bash start() { echo -n "Starting eclipse: " /opt/eclipse/eclipse return 0 } stop() { killproc eclipse return 0 } case "$1" in start) start ;; stop) stop ;; esac (2)Terminalで以下のコマンドを実行。(ランレベルや優先順位はデフォルト値に任せています) $ sudo su # chmod 755 /etc/init.d/start_eclipse # update-rc.d start_eclipse defaults (3)Ubuntuを再起動して確認。⇒アプリ(この場合はeclipse)は起動しませんでした。 私としてはスクリプトの書き方が間違っているのではないかと予想しているのですが、スクリプトについてネットで調べると、今回のような単純なアプリ起動・終了方法についての情報があまり載っていない(と思う)ため、自力では間違い箇所が発見できませんでした。 ついでと言ってはなんですが、起動スクリプトの書き方や設定方法について参考になるサイトがありましたら、そちらも教えていただけましたら幸いです。 以上、宜しくお願い致します。

  • Linux起動時にコマンドを実行

    Windowsで例えると、スタートアップにVBSを置くようなことをしたいです。 VineLinuxの起動時に、/etc/init.d/webmin start をさせたい場合、どうやったらいいか教えてください。 起動時のスクリプト実行の練習をしたいので、ツールやwebminの基本機能に頼らず、原始的な方法でやりたいです。 Windowsで例えると、msconfigからやるのではなく、runに直接書き込むような感じでやりたいです。 LinuxなのでVBSでなく*.shを使うのでと思うのですが。

  • FreeBSD における、アプリの起動スクリプトと登録の方法

    いま独自のサーバ用アプリを作っています。それを、FreeBSD起動時に自動的に立ち上がるようにしたいのですが、方法が分かりません。教えていただける方、あるいは、参考URLをご存知の方お教えください。 たとえば、linuxでしたら、 /etc/init.d/hogehoge start とすると、hogehogeアプリを起動し、 /etc/init.d/hogehoge stop とすると、hogehogeアプリを停止するようなスクリプトを書きます。hogehoge中身は、たとえば、以下のような感じですかね。 ----------------------------------------------------- #! /bin/sh # # chkconfig: 2345 85 15 # description: hoge hoge ... . /etc/rc.d/init.d/functions cd /usr/local/xl-gbs PATH=$PATH:/usr/local/xl-gbs/xlscript/bin export PATH start() { xl gbserver.xl / start echo } stop() { xl gbserver.xl / stop echo } restart() { stop start } case "$1" in start) start ;; stop) stop exit 1 ;; restart) restart ;; *) ;; esac exit 0 ----------------------------------------------------- その上で、 % chmod 0755 /etc/init.d/hogehoge % chkconfig --add /etc/init.d/hogehoge という風に登録します。 まあ、この操作に対応するFreeBSDの操作を教えていただければありがたい。

  • CRON起動できない

    Solaris+Cで開発しています。 作成したプログラムを、CRON起動で定周期で起動させたいのですが、  1.実行ファイルを作成  2.実行ファイルを起動するシェルを作成  3.作成したシェルをXX時XX分に起動するようにcrontabに設定 ・・・のようにしたのですが、以下のようなエラーでうまく動作しません。(proc_Aは実行ファイル名) ld.so.1: proc_A: fatal: libclntsh.so.8.0: open failed: No such file or directory Killed ちなみに、上記2で作成したシェルを直接たたくと、正常に動作します。 どのように対処すればよいか、ご教授願います。