Unser Systemadministrator installierte eine Softwareanwendung (Maven) auf dem Server und forderte alle auf, den /usr/local/maven/bin/
Ordner ihrem Pfad hinzuzufügen .
Ich denke, es könnte bequemer sein, nur die wenigen Programme in diesem Ordner aus dem /bin
Ordner (oder einem anderen Ordner, den jeder im Pfad hat) wie folgt zu verknüpfen :
ln -s /usr/local/maven/bin/* /bin
Ist das richtig? Gibt es einige versteckte Nebenwirkungen für meinen Vorschlag?
symlink
path
directory-structure
Erel Segal-Halevi
quelle
quelle
/opt
.Antworten:
Beim Verlinken
Sie verknüpfen im Allgemeinen nicht
/usr/local/*
mit/bin
, aber dies ist eher eine historische Praxis. Im Allgemeinen gibt es einige "technische" Gründe, warum Sie nicht das tun können, was Sie vorschlagen.Das Herstellen von Links zu ausführbaren Dateien in
/bin
kann zu Problemen führen:Wahrscheinlich ist die größte Einschränkung, wenn Ihr System Pakete von einer Art Paket-Manager wie RPM, dpkg, APT, YUM, pacman, pkg_add usw. verwalten lässt. In diesen Fällen möchten Sie das Paket im Allgemeinen zulassen Manager seine Arbeit tun und zu verwalten Verzeichnisse wie
/sbin
,/bin
,/lib
, und/usr
. Eine Ausnahme wäre, dass/usr/local
dies in der Regel ein sicherer Ort ist, an dem Sie tun können, was Sie für richtig halten, ohne sich Sorgen machen zu müssen, dass ein Paketmanager Ihre Dateien stört.Oft
/usr/local
ist dieser Pfad für ausführbare Dateien in ihren ausführbaren Dateien fest programmiert. Möglicherweise sind auch Konfigurationsdateien im/usr/local
Rahmen der Installation dieser Anwendungen enthalten. Wenn Sie also nur auf die ausführbare Datei verlinken, kann dies zu Problemen führen, wenn diese Apps die.cfg
Dateien später finden. Hier ist ein Beispiel für einen solchen Fall:Dasselbe Problem, das beim Suchen von
.cfg
Dateien auftritt , kann auch bei ausführbaren Hilfsprogrammen auftreten, die von der primären App ausgeführt werden müssen. Auch diese müssen verknüpft werden/usr/bin
, da dies möglicherweise problematisch ist und nur angezeigt wird, wenn Sie tatsächlich versucht haben, die verknüpfte App auszuführen.HINWEIS: Im Allgemeinen ist es am besten, die Versuchung zu vermeiden, eine Verknüpfung zu einmaligen Apps in zu erstellen
/usr/bin
./etc/profile.d
Wenn dann nicht alle Benutzer diese Verwaltung bereitstellen, kann der Administrator dies ganz einfach jedem
$PATH
auf der Box hinzufügen, indem er eine entsprechende Datei in das/etc/profile.d
Verzeichnis einfügt.Eine Datei wie diese
/etc/profile.d/maven.sh
:Sie tun dies in der Regel als Administrator, anstatt alle Setups der Benutzer damit zu belasten.
Alternativen nutzen
Die meisten Distributionen bieten jetzt ein anderes Tool namens
alternatives
(Fedora / CentOS) oderupdate-alternatives
(Debian / Ubuntu) an, mit dem Sie auch die$PATH
Tools aufrufen können, die sich möglicherweise außerhalb des befinden/bin
. Die Verwendung von Tools wie diesen ist vorzuziehen, da diese eher dem entsprechen, was die meisten Administratoren als "Standardübung" betrachten, und so die Weitergabe der Systeme von einem Administrator an einen anderen erleichtern.Dieses Tool führt eine ähnliche Aktion aus, indem es Verknüpfungen herstellt
/bin
. Aber es verwaltet die Erstellung und Zerstörung dieser Links, so dass es einfacher ist, die beabsichtigte Einrichtung eines Systems zu verstehen, wenn dies mit einem Tool durchgeführt wird, oder direkt, wie Sie es vorschlagen.Hier verwende ich dieses System, um Oracle Java auf einer Box zu verwalten:
Sie können die Auswirkungen sehen:
Meine $ 0,02
Die
/bin
meisten Systemadministratoren würden davon abraten, Verknüpfungen herzustellen, obwohl dies plausibel ist:quelle
/bin
Verzeichnis nicht besitzen . Hier ist ein Beispiel. Auf Red Hat-Distributionen, die RPM verwenden, wenn eine Datei bereits in/bin
RPM vorhanden ist, wird die Installation nicht wie oben beschrieben ausgeführt, es sei denn, Sie müssen den--replacefiles
Switch verwenden , um dies zu tun . Das ist also nicht wirklich ein technischer Grund. Gleiches gilt für andere Verzeichnisse. Ich verstehe, was Sie über das "Besitzen" des Betriebssystems sagen,/bin
aber es ist nicht so eindeutig, wie Sie sagen.Beantwortung der gestellten Fragen:
Nein , es ist eine schlechte Praxis.
Ja, es gibt mehrere Nebenwirkungen. Ihr Vorschlag kann je nach Anwendung funktionieren oder auch nicht und kann sich auf lange Sicht zurückbilden oder gebrochen werden.
Es gibt vernünftige Gründe , eine solche symbolische Verknüpfung nicht zu erstellen:
Administratoren "besitzen" nicht
/bin
(siehe Hinweis 1), da dieses Verzeichnis den Entwicklern von Betriebssystemen / Distributionen gehört. Auf der anderen Seite/usr/local
handelt es sich um einen traditionellen Speicherort für Software, die vom lokalen Administrator erstellt wurde,/opt/<packagename>
und für entbündelte Software. Wenn Sie eine Datei oder einen Link erstellen/bin
, besteht die Gefahr, dass diese durch eine Paketinstallation überschrieben wird, in Ihrem Fall durch einmaven
vom Betriebssystem bereitgestelltes hypothetisches Paket, was zu einer Regression führen kann, wenn das lokal erstellte Paket aus einer neueren Version erstellt wird Quellcode, der die OS-Version. Zum Beispiel überschreiben SVR4-pkgadd
, Debian-dpkg
, Red-Hat-rpm
und Slackware-Tarballs blind Ihren symbolischen Link.Einige Anwendungen suchen den Ort, an dem sie aufgerufen werden, um Konfigurationsdateien, Plugins und ähnliche Ressourcen abzurufen. Wenn Sie die Anwendung über eine symbolische Verknüpfung aufrufen, folgt ihr Code möglicherweise nicht und sucht dann nach diesen Ressourcendateien,
/usr/bin
wo sie sich nicht befinden.Möglicherweise befinden sich andere Binärdateien inWurde entfernt, da Sie dies bei Ihrem Befehl bereits berücksichtigt haben, indem Sie alle potenziellen Befehle verknüpfen./usr/local/maven/bin
Ihrem PATH. Wenn Sie dieses Verzeichnis nicht zu Ihrem PATH hinzufügen, sind sie nicht verfügbar.Die Seite maven2 fordert Sie auf, dieses Verzeichnis zu Ihrem PATH hinzuzufügen (genau: Fügen Sie M2-Umgebungsvariable zu Ihrem Pfad hinzu, z. B. export PATH = $ M2: $ PATH .). Wenn Sie einen anderen Ansatz verwenden, brechen Sie diesen Schritt ab und werden nicht unterstützt Weg. Wenn die meisten Benutzer eines Systems potenzielle
maven
Benutzer sind, ist es natürlich sinnvoller, dasPATH
global festzulegen, als bei jedem einzelnen.profile
.Anmerkung 1:
Slackware-Dokumentation:
Debian / Filesystem Hierarchy Standard
Solaris-Dokumentation:
Ein einfacher Test, der zeigt, dass Debian
dpkg
keinen bestehenden Link beibehält, auch wenn die--force-overwrite
Option nicht verwendet wird:quelle
/bin
oder installiert/usr/bin
. Nach dem Erkennen der Probleme mit versteckten oder zerstörten System-Binärdateien (die bekannteste wartest
) wurde die bewährte Methode, nicht-System-Binärdateien an einer anderen Stelle zu installieren, schrittweise übernommen.Wenn Sie einen Symlink erstellen möchten, ist es besser, einen Symlink zu erstellen
/usr/local/bin
. Auf meinem Server habe ich lokale Software installiert/opt/NAME
und die Binärdateien mit diesen verknüpft/usr/local/bin
.quelle
Eine Alternative zu den beiden vorgeschlagenen Methoden besteht darin, ein Shell-Skript zu erstellen
/usr/local/bin
, das bei der Ausführung die im Skript angegebene Binärdatei ausführt. Zum Beispiel würde ich am Beispiel von maven ein Shell-Skript/usr/local/bin
namens erstellenmaven
, das ein kleines Skript enthält, um die maven-Binärdatei dort auszuführen, wo sie sich befindet, und alle Argumente an sie weiterzuleiten:Dies hat den Nachteil, dass Sie dies für jede Binärdatei tun müssen, die Sie "verknüpfen" möchten, aber Sie können diese Binärdateien von der Befehlszeile aus aufrufen, ohne Ihre
$PATH
Umgebungsvariable durcheinander bringen zu müssen.quelle