web-dev-qa-db-ja.com

systemdで古いinitdスクリプトをデバッグする方法は?

アプリケーションを起動するための古いinitdスクリプトがあります。古いバージョンのSuSEでは正常に動作しましたが、Open SuSE12.3では失敗します。

奇妙なことは

cd /etc/init.d ; ./script start

正常に動作します。

/etc/init.d/script start

はsystemctlへのリダイレクトを示していますが、アプリケーションを起動しません(また、initdスクリプトからの出力も表示しません)。

何が問題なのかを示すログエントリが表示されません。私が見る唯一のエントリは、アプリケーションが開始されたことを示す/ var/log/messagesにあります。

これをデバッグするにはどうすればよいですか?

5
Gene Vincent

スクリプトがこの動作をする理由は、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ページで 適切なカスタムサービススクリプトを書くために必要な情報を見つけるでしょう。

1
MariusMatutiae

いくつかのこと。

  1. クリーンな環境でコマンドを実行します。

    env -i PATH=/usr/sbin:/sbin:/usr/bin:/bin /etc/init.d/SCRIPT start
    
  2. 次に、シェルのデバッグをオンにします。これを行う簡単な方法の1つは、次のとおりです。

    bash -x SCRIPT start
    

2つを組み合わせると、次のようになります。

    env -i PATH=/usr/sbin:/sbin:/usr/bin:/bin bash -x /etc/init.d/SCRIPT start
  1. 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終了するには、「フォロー」モードをスクロールして戻ることができます。

2
Otheus

/etc/init.d/scriptの内部には、/ etc/init.d /の外部には関係のない相対パスがある可能性があります。スクリプトの内容をここに置くことができます(本当に巨大でない限り)。

アプリケーションの作業ディレクトリはアプリケーションが開始されるディレクトリであるため、アプリケーションに送信する引数に相対パスが含まれていないことを確認してください。

0
Mihai