inittab
現在、起動時にプログラムが読み込まれるように追加する必要があるプロジェクトに取り組んでいます。
起動しようとしているプログラムは、c# mono アプリケーションです。起動スクリプトを作成しましたが、起動スクリプトを手動で実行すると、プログラムは正常に起動します。ただし、それをinittab
プログラムに挿入しても起動しません。
チェックインしました/var/log/messages
が、何も問題はなく、単にリロード中であると表示されます。
inittab
以下は私がスクリプトに追加した内容です
bes:2345:respawn:/home/bits/MyProgram/start.myprogram
ご協力いただければ幸いです
アップデート 以下は、/home/bits/MyProgram にある起動スクリプトのコードです。
#!/bin/sh
cd /home/bits/MyProgram
/usr/bin/mono EmailServer.exe "$@"
また、/usr/bin/monoで始まる行の末尾に> mylog.txtを追加してみました。例:
/usr/bin/mono EmailServer.exe "$@" > mylog.txt
起動スクリプトを手動で実行すると、起動スクリプトが配置されているディレクトリにいなくても正常に動作します。inittab に追加して telinit q を実行しても、起動されず、ログが書き込まれませんが、プログラムを手動で起動するとログが書き込まれます。
ご協力いただければ幸いです。
答え1
プログラムをどこかに置いてください。
にあるinitジョブ制御用のスケルトンテンプレートファイルをコピーして編集します。スケルトン。
このファイルを変更して、必要なランレベルを指定します...例では、2、3、4、5が必要です。ファイルの先頭(コメント内)に、必要なランレベルを示すオプションがあります。
この新しいファイルを翻訳元わかりやすい名前を付けます。(私の名前例で使用)
これをテストしたり、有効/無効にしたりするためのプラットフォームに依存しない方法(スケルトンファイル)
sudo /etc/init.d/myfancyname start
sudo /etc/init.d/myfancyname stop
sudo /etc/init.d/myfancyname restart
ディストリビューションごとに同じ操作を実行する方法があり、例えばDebianではupdate-rc.d myfancyname [開始|停止|有効化|無効化...]
inittabを変更すると一般的に1つの悪いアイデアですが、これを台無しにすると、システムは起動しなくなり、2 つの問題が発生します。(正規表現は必要ありません!)
/etc/init.d/ サブディレクトリにスクリプトを追加する方法はより標準化されており、ほぼすべての Linux フレーバー (おそらく一部の *nix や一部の bsd など) で使用できます。
答え2
問題は単純です。OpenSuse 12.1を使用しているのですが、用途 システムクラシックの代わりにSystem V ブートシステム。
新しいサービスをインストールするには、/etc/systemd/system/myprogname.serviceに次のファイルを作成します。
[Unit]
Description=My progname service file
[Service]
ExecStart=/home/bits/MyProgram
[Install]
WantedBy=multi-user.target
その後走っsystemctl daemon-reload
てsystemctl start myprogname.service
MyPrognameを自動的に再起動したい場合は、以下を追加する必要があります。
Restart=restart-always
サービスセクションへ。
答え3
telinit q
init にリロードを指示するには、実行する必要があります。これは自動的には実行されません。システム ログにメッセージ (このメッセージは見たことありますよね?) が/etc/inittab
記載されているので、すでに実行したと思います。Re-reading inittab
問題は、プロセスがまったく起動しないか、プログラムの起動中に失敗することですか? エラーをログ ファイルにリダイレクトするラッパー スクリプトを作成します。
#!/bin/sh
exec >/var/log/myprogram.log 2>&1
exec /home/bits/MyProgram/start.myprogram
ログ ファイルが作成されているかどうかを確認し、そこにエラーが表示されているかどうかを確認します。
1 つ思い浮かぶのは、プログラムがセッションで設定された環境変数を必要とする可能性があるということです。init
プロセスには、非常に限られた環境があります。必要に応じて、ラッパー スクリプトを変更して、必要なすべての変数を設定します。
答え4
init
読み取ると指示で実行するにはinittab
、シェルをフォークして指示exec
シェル内のコマンドのパラメータとして。手動で実行した場合に何が起こるか確認してみましょう。
sh -c exec /home/bits/MyProgram/start.myprogram
私が試すもう一つの方法は、inittab に次のような記述を追加して、ランチャー スクリプトを完全にバイパスすることです。
bes:2345:respawn:/usr/bin/mono /home/bits/MyProgram/EmailServer.exe "$@"