背景

背景

フォーマットに関する考慮事項

質問から詳細が消えたようで、戻って特定の質問に太字のテキストを追加しました。しかし、最も簡単な解決策が必ずしも機能しない理由を理解するには、詳細が必要です。

背景

最近、StackOverflowでこのような質問が提起されたが、厳密な意味でプログラミングとは関係がないので、親切に受け入れられなかった。当社はクラウドに大規模な移行を進めており、すべてをローカルで構築する代わりにDockerを使用しています。全体的に素晴らしいですが、私たちは正しいことをしようとしています™。これを達成するために、私はUnix / Linuxの深さとそれがどのように機能するかについて多くを学びましたが、どのアプローチが他のアプローチよりも優れているかは必ずしも理解していませんでした。

編集する

Marcusが提供した豊富な情報の後、私はより多くの文脈を追加する必要があることに気づきました。したがって、GitLab CI / CDを使用してクラウドにコードを配布します。私たちは高いセキュリティ要件を持っており、誰かがセキュリティスキャンやそのような性質の他のタスクをスキップすることを許可することができないため、パイプライン設計は個々のリポジトリに任せられません。このレベルの制御を提供するために、パイプラインを外部リポジトリにします。これには、他のパイプラインプロジェクトによって接続できる拡張ポイントがあります(メインパイプラインに昇格されたマージ要求を介して)。

パイプライン拡張は、YAML構成とDockerイメージの2つの部分で構成されています。 YAMLを短く保つために、我々は特定のパイプラインステップに対するすべてのロジックをそれが実行されるコンテナに入れるアプローチをとりました。これを実行する最初は、多くのスクリプトが/usr/local/bin

docker compose up
timeout $SERVICE_READY_TIMEOUT sh -c \
    "until curl --output /dev/null --silent --fail $SERVICE_READY_ENDPOINT; do \
        sleep 1; \
    done"
# run the integration test after service is ready

代わりに、次のスクリプトを追加しました/etc/profile.d

#!/bin/sh

## Define functions to be loaded into the shell environment
pollUrl() {
  endpoint="$1"

  until curl --output /dev/null --silent --fail "$endpoint"; do 
    sleep 1; 
  done
}

waitForLive() {
  max_duration=$1
  endpoint="$2"

  timeout $max_duration sh -c "pollUrl '$endpoint'"
}

私が解決しようとしているもう一つの具体的な問題は、別のステップで使用するために1つのステップに環境変数を保存することです。はい、最も簡単な解決策は両方の場所にコピーすることです。問題は2つのバージョンがあることです。私がキャプチャする変数はDockerイメージビルドに提供されていますが、後で実際のパイプライン拡張に使用されます。私の現在のアプローチ/etc/profile.dにもそれを書き留めました。

しかし、私たちは元の質問に戻ります。ENVプロファイルがロードされるようにユーザーに対してこれをどのように定義しますか?

質問

シェルの起動時に何が起こるのか、いつ/etc/init.d優先されるのか、いつに比べて正しい設定ファイルが最初にロードされるのかを定義/etc/profile.dするにはどうすればよいですか?$ENVさらに重要なのは、どのようなものがどこに行くのかということです。例:再利用のためにシェルにロードする関数、NPM / Yarnなどのツールを構成するために使用される環境変数、特に$ENVシェルの起動方法を決定する要素。

私は完全にLinuxに初めて触れたので、これらのことを説明する公式文書があれば非常に役立ちます。私はLinux Documentation Project(PDF)をダウンロードし、そこにあるさまざまなLinuxのマニュアルページサイトを頻繁に訪問しましたが、ほとんどのソースはBashを好みますが、これはいつも私にとってはオプションではありません。

更新された質問

それで私はこのような質問をするのです。関連シェル(Bash、ZSHなど)で指定されていないシェルで関数と環境変数を定義するPOSIX互換の方法は何ですか?あるシステムと別のシステムでいつ使用するべきかについてはどのようなガイドラインを提供できますか?

追加情報

.<name>rcZSHやBashなどの一部のシェルは、実行コマンドファイルだけでなく、.<name>_profileまたはなどの他の規則も提供することを知っています.profile。これにより、ENV=/etc/profileDockerfileの設定は現在のユーザーで/etc/profile.d終わり、現在のユーザーが実行できる*.shディレクトリ内のすべての項目をロードすることがわかりました。ただし、必要に応じてカスタマイズできるWSL環境では、ENVシェルに入る前に値をプリロードすることはできません。特に、/bin/shクロスプラットフォームスクリプトの互換性をテストするために値を使用しようとすると(Macユーザーがいるため、私のBashスクリプトはしばしばクラッシュします)。

答え1

シェルを起動するときに何が起こるのか、いつ/etc/init.dが優先され、いつ/etc/profile.dが優先されますか?

彼らは全く違うことをします。

profile.dには、パブリック環境を設定するために使用されるシェルからインポートされたスクリプトが含まれています。 init.dには、起動制御プログラムから開始してサービス構成を開始、停止、再起動、または再ロードするスクリプトが含まれています。このスクリプトに渡されたパラメータについて

企業が現在クラウドに移行している場合は、一般的なクラウドVM展開(OpenSUSE、Alma Linux / Rocky Linux / Oracle Linux / Red Hat Enterprise Linux、またはUbuntu)がこれを行います。いいえSysVを使用してください。 (エミュレーションレイヤを介してサポートしています。)

これらのディストリビューションは、実際にsystemdのきめ細かい制御、並列性、および弾力性を利用します。

他の一般的なクラウド展開は、コンテナで単一のサービスを開始することに基づいているため、通常返品これらのコンテナにはsysvinitへの依存関係はありません。

したがって、本当の質問は、クラウドサービスを考慮すると、なぜ2024年にsysvinitを読むのかということです。

例:再利用のためにシェルにロードする関数、NPM / Yarnなどのツールを構成するために使用される環境変数、特にシェルの起動方法を決定する$ ENVなどの項目。

これは開発/使用上の問題であり、クラウドサーバーでやりたいことのようには聞こえません。通常、特定のサービスを実行するために必要な環境変数をサービスファイルに配置します(systemdの場合)。 sys v初期化スクリプトの場合、管理者はこれを修正しました。方法を変えたら役に立たないみんな1つだけを修正し、予期しない副作用を避けたい場合は、Apache httpサーバー(例)を起動できます。

一般的に、私は個人的にsystemdサービスファイルがサービスを制御するよりきちんとした方法だと思い、サービス制御に初めて触れるLinuxシステム全体でそれを採用するのに十分な理由があります。小さいながらも声が大きいユーザーコミュニティは、systemdが邪悪だと思います。いいね

ただし、必要に応じてカスタマイズ可能なWSL環境では、シェルに入る前にENV値をプリロードすることはできません。特に、プラットフォーム間のスクリプト互換性をテストするために/ bin / shを使用しようとすると(ZSHがあります)、Macユーザーなので、私のBashスクリプトはしばしばクラッシュします。

これはすべてコンピュータのローカルコンテンツです。構成を入れてあなたのプライベートシェルはプライベート〜/.zshrcにあります。

関連情報