2

Wget を使用して適切なインストール プロセスを実行しようとしています。この例では、Nginx を使用します。

# Download nginx to /tmp/ directory
wget http://nginx.org/download/nginx-1.3.6.tar.gz -r -P /tmp

# Extract nginx into /tmp/nginx directory
tar xzf nginx-1.3.6.tar.gz -C /tmp/nginx

# Configure it to be installed in opt
./configure --prefix=/opt/nginx

# Make it
make

# Make install
make install

# Clean up temp folder
rm -r /tmp/*

これは理想化されたプロセスですか?改善できることはありますか?

4

2 に答える 2

4

まず第一に、あなたは間違いなく車輪を再発明しているように見えます: 解決したい問題が自動パッケージ化/ターゲット システムでのソフトウェアのビルドである場合、さまざまなパッケージ管理システム、ポート ビルダーなどの形で無数のソリューションが利用可能です。 .

シェル スクリプトに関しては、修正を検討すべき点がいくつかあります。

  • http://nginx.org/download/nginx-1.3.6.tar.gzまたはのようなものnginx-1.3.6.tar.gzは定数です。すべての定数を個別の変数に抽出し、それらを使用して、このスクリプトの保守を少し簡単にするようにしてください。次に例を示します。

    NAME=nginx
    VERSION=1.3.6
    FILENAME=$NAME-$VERSION.tar.gz
    URL=http://nginx.org/download/$FILENAME
    TMP_DIR=/tmp
    INSTALL_PREFIX=/opt
    
    wget "$URL" -r -P "$TMP_DIR"
    tar xzf "$FILENAME" -C "$TMP_DIR/nginx"
    
  • 通常、wget が対象の展開システムに存在することを 100% 確信することはできません。移植性を最大限に高めたい場合はwget、 、curlfetchまたはlynxlinks、などの一般的なネットワーク ユーティリティの検出を試みることができますw3m

  • 一時ディレクトリを使用する適切な方法は、長い別の質問ですが、一般的に、次の 3 つのことに従う必要があります。

    • 何らかの方法で一時ディレクトリの場所を見つける必要があります。一般に、それ/tmpが常に一時ディレクトリであると仮定するのは間違っています。マウントできない、書き込み不可、tmpfs満杯のファイルシステムなどである可能性があるためです。残念ながら、何を検出するための移植可能で普遍的な方法はありません。一時ディレクトリは. 少なくとも 1 つは、の内容をチェックアウトし$TMPDIRて、ユーザーがスクリプトを適切な一時ディレクトリにポイントできるようにすることです。もう 1 つの考えられる優れたアイデアは、一連のヒューリスティック チェックで、目的の場所への書き込みが可能であること (少なくとも$TMPDIR$HOME/tmp/tmp、をチェック/var/tmp)、利用可能な十分な容量があることなどを確認することです。
    • 安全な方法で一時ディレクトリを作成する必要があります。Linux システムでmktemp --tmpdir -d some-unique-identifier.XXXXXXXXXは、通常は で十分です。mktempBSD ベースのシステムでは、デフォルトの実装が特に競合に強いわけではないため、はるかに多くの手作業が必要でした。
    • 使用後に一時ディレクトリをクリーンアップする必要があります。クリーニングは、終了が成功した場合だけでなく、失敗した場合にも実行する必要があります。これは、シグナル トラップと特別なクリーンアップ コールバックを使用して修正できます。次に例を示します。

      # Cleanup: remove temporary files
      cleanup()
      {
              local rc=$?
              trap - EXIT
      
              # Generally, it's the best to remove only the files that we
              # know that we have created ourselves. Removal using recursive
              # rm is not really safe.
              rm -f "$LOCAL_TMP/some-file-we-had-created"
              [ -d "$LOCAL_TMP" ] && rmdir "$LOCAL_TMP"
      
              exit $rc
      }
      trap cleanup HUP PIPE INT QUIT TERM EXIT
      
      # Create a local temporary directory
      LOCAL_TMP=$(mktemp --tmpdir -d some-unique-identifier.XXXXXXXXX)
      
      # Use $LOCAL_TMP here
      
  • 本当に recursive を使用したい場合rm、 anyを使用し*てファイルをグロブするのは悪い習慣です。ディレクトリに数千を超えるファイルがある場合、*引数が多すぎてシェルのコマンド ライン バッファがオーバーフローします。正当な理由なしにグロビングを使用することは、一般的に悪い習慣であるさえ言えます。上記の rm 行は、少なくとも次のように書き換える必要があります。

    rm -f /tmp/nginx-1.3.6.tar.gz
    rm -rf /tmp/nginx
    

    /tmp( のように)内のすべてのサブディレクトリを削除すること/tmp/*は、マルチユーザー システムでは非常に悪い方法です。パーミッション エラーが発生するか (他のユーザーのファイルを削除できなくなります)、または他のユーザーのファイルを大幅に混乱させる可能性があるためです。頻繁に使用される一時ファイルを削除することで、人々の作業を軽減します。

  • いくつかのマイナーな研磨:

    • POSIX 標準tarでは、今日では通常の短い UNIX オプション、つまりtar -xvznotを使用していtar xvzます。
    • -z最新の GNU tar (および、AFAIR、BSD tar も) は、-j、 、などの「解凍」フラグを実際には必要としません-y。アーカイブ/圧縮形式自体を検出し、 / / tarballtar -xfを抽出するのに十分です。.tar.tar.gz.tar.bz2
于 2012-10-02T23:15:05.307 に答える
1

それが基本的な考え方です。make install コマンドを root (または必要に応じてスクリプト全体) として実行する必要があります。他のコマンドが tmp ディレクトリで作業中のものを持っている可能性があるためですrm -r /tmp/*rm -r /tmp/nginx

そのようなソースからのビルドが、まともなサイズのプロジェクトで変更なしで機能する可能性はかなり低いことにも注意してください。通常、ライブラリへのパスを明示的に指定する必要があるか、一部のコードがディストリビューションで正しくコンパイルされないことがわかります。

于 2012-09-30T19:57:57.850 に答える