OpenSuse 12.1 の inittab に項目を追加する

OpenSuse 12.1 の inittab に項目を追加する

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-reloadsystemctl start myprogname.service

MyPrognameを自動的に再起動したい場合は、以下を追加する必要があります。

Restart=restart-always

サービスセクションへ。

答え3

telinit qinit にリロードを指示するには、実行する必要があります。これは自動的には実行されません。システム ログにメッセージ (このメッセージは見たことありますよね?) が/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 "$@"

関連情報