これはおそらくオペレーティングシステムの検出に関連しているかもしれませんが、特に現在システムで使用されているinitシステムが必要です。
Fedora 15とUbuntuはsystemdを使用し、UbuntuはUpstart(15.04までのデフォルト)を使用し、他のバージョンはSystem Vバリアントを使用します。
私はクロスプラットフォームデーモンでアプリケーションを書いています。初期化スクリプトは、構成中に渡されたパラメーターに基づいて動的に生成されます。
私が望むのは、彼らが使用している特定の初期化システム用のスクリプトを生成することだけです。このように、インストールスクリプトは引数なしでルートとして合理的に実行でき、デーモンは自動的に「インストール」されます。
これが私が思いついたものです:
- / binでsystemd、upstartなどを検索してください。
- /proc/1/commをsystemd、upstartなどと比較します。
- ユーザーに尋ねる
これを行うための最良のクロス/プラットフォーム方法は何ですか?
ある程度関連があり、ほとんどの* nixをサポートするためにbashを使用できますか?それとも配布/OSに依存していますか?
ターゲットプラットフォーム:
- アップルシステム
- Linux(すべてのディストリビューション)
- BSD(全バージョン)
- Solaris、Minix、その他 *nix
ベストアンサー1
私はこの問題に直接直面し、いくつかのテストを行うことにしました。流通ごとに別々の梱包が必要だという回答には全く同意しますが、時には現実的な問題(特に人材)がある場合があります。
だから、「自動検出」をしたい人のためにこれが私が見つけたものです。限られた配布セットについて(詳細は以下から):
次のことで、スタートアップを見つけることができます。
[[ `/sbin/init --version` =~ upstart ]] && echo yes || echo no
次のようにsystemdに知ることができます。
[[ `systemctl` =~ -\.mount ]] && echo yes || echo no
次の方法でsys-v initに通知できます。
[[ -f /etc/init.d/cron && ! -h /etc/init.d/cron ]] && echo yes
以下は、次のコマンドラインを使用して行った実験です。
if [[ `/sbin/init --version` =~ upstart ]]; then echo using upstart;
elif [[ `systemctl` =~ -\.mount ]]; then echo using systemd;
elif [[ -f /etc/init.d/cron && ! -h /etc/init.d/cron ]]; then echo using sysv-init;
else echo cannot tell; fi
EC2インスタンス(us-east AMI IDが含まれています):
- ArchLinux:systemdの使用(以降2012.10.06)
- CentOS6.4 ami-52009e3b: upstartを使う
- CentOS7 ami-96a818fe:systemdを使用する
- Debian 6 ami-80e915e9: sysv-init の使用
- Debian 7.5 ami-2c886c44: sysv-init の使用
- Debian 7.6 GCEコンテナ仮想マシン:sysv-initを使用する
- RHEL 6.5 ami-8d756fe4: upstartを使う
- SLES 11 ami-e8084981:sysv-initの使用
- Ubuntu 10.04 ami-6b350a02:upstartを使う
- Ubuntu 12.04 ami-b08b6cd8: upstartを使う
- Ubuntu 14.04 ami-a427efcc:upstartを使う
- Ubuntu 14.10以下:systemdを使用する
- AWS Linux 2014.3.2 ami-7c807d14: upstart の使用
- Fedora 19 ami-f525389c:systemdの使用
- Fedora 20 ami-21362b48: systemdの使用
明確にすべきことは次のとおりです。私はこれが完璧だと言うものではありません!、ほとんどわからない。また、便宜のためにbash正規表現マッチングを使用していますが、どこでも使用できるわけではありません。今は上記の内容で十分です。ただし、壊れたディストリビューションを発見されたらお知らせいただき、該当問題を再現するEC2 AMIがあれば修正するよう努力いたします。