アプリケーションを起動するための古いinitdスクリプトがあります。古いバージョンのSuSEでは正常に動作しましたが、Open SuSE12.3では失敗します。
奇妙なことは
cd /etc/init.d ; ./script start
正常に動作します。
/etc/init.d/script start
はsystemctlへのリダイレクトを示していますが、アプリケーションを起動しません(また、initdスクリプトからの出力も表示しません)。
何が問題なのかを示すログエントリが表示されません。私が見る唯一のエントリは、アプリケーションが開始されたことを示す/ var/log/messagesにあります。
これをデバッグするにはどうすればよいですか?
スクリプトがこの動作をする理由は、OpenSuse 12.3が古いsysvinitをsystemdに置き換えたためです。これは、ブートプロセス全体を制御するシステム管理daemnです。
Systemdによって開始されるサービスを記述するスクリプトの形式は、sysvinitの形式とは異なるため、スクリプトが失敗するのも不思議ではありません。スクリプトが適切に設定されると、systemctlを介したその操作は簡単です。
Sudo systemctl enable/disable your-service
それを有効または無効にし、通常は
Sudo systemctl start/stop/status your-service
起動、停止、ステータス後のお問い合わせ。
一般的なカスタムサービススクリプトは、フォルダー/ etc/systemd/systemにあり、接尾辞.serviceで終わり、次の形式になっています。
[Unit]
Description=sdbarker.com Chiliproject
Requires=mysqld.service nginx.service
Wants=mysqld.service nginx.service
[Service]
User=www-data
WorkingDirectory=/path/to/chiliproject/install
ExecStart=/usr/bin/bundle
PIDFile=/path/to/chiliproject/install/tmp/pids/server.pid
[Install]
WantedBy=multi-user.target
ご覧のとおり、ほとんどのエントリは自明です。あなたのスクリプトについてもっと知らなければ、私はそれ以上の援助を提供することはできませんが、あなたは このArch Linux Wikiページで 適切なカスタムサービススクリプトを書くために必要な情報を見つけるでしょう。
いくつかのこと。
クリーンな環境でコマンドを実行します。
env -i PATH=/usr/sbin:/sbin:/usr/bin:/bin /etc/init.d/SCRIPT start
次に、シェルのデバッグをオンにします。これを行う簡単な方法の1つは、次のとおりです。
bash -x SCRIPT start
2つを組み合わせると、次のようになります。
env -i PATH=/usr/sbin:/sbin:/usr/bin:/bin bash -x /etc/init.d/SCRIPT start
systemd
の互換モードを無効にします。
SYSTEMCTL_SKIP_REDIRECT=true
この変数の名前は異なる場合があります。あなたのinitスクリプトにはおそらく次のようなものが含まれています
. /etc/sysconfig/functions
そのファイルは、上記の環境変数をチェックします。 (Suseは、RedHatベースのいとことは少し異なるため、YMMVです)。
上記のすべてを組み合わせる:
env -i PATH=/usr/sbin:/sbin:/usr/bin:/bin SYSTEMCTL_SKIP_REDIRECT=true \
bash -x /etc/init.d/SCRIPT start
最後に、出力が大量になるため、以下を追加します。
2>&1 | less -r +F
less
プログラムは出力をバッファリングし、履歴全体をスクロールバックできるようにします。ヒットCTRL-C
終了するには、「フォロー」モードをスクロールして戻ることができます。
/etc/init.d/scriptの内部には、/ etc/init.d /の外部には関係のない相対パスがある可能性があります。スクリプトの内容をここに置くことができます(本当に巨大でない限り)。
アプリケーションの作業ディレクトリはアプリケーションが開始されるディレクトリであるため、アプリケーションに送信する引数に相対パスが含まれていないことを確認してください。