Notre administrateur système a installé une application logicielle (Maven) sur le serveur et a dit à tout le monde d'ajouter le /usr/local/maven/bin/
dossier à leur chemin.
Je pense qu'il pourrait être plus pratique de simplement lier les quelques programmes de ce dossier à partir du /bin
dossier (ou d'un autre dossier que tout le monde a sur son chemin) comme ceci:
ln -s /usr/local/maven/bin/* /bin
Est-ce correct? Y a-t-il des effets secondaires cachés à ma suggestion?
symlink
path
directory-structure
Erel Segal-Halevi
la source
la source
/opt
.Réponses:
Sur la liaison
Vous ne vous liez généralement pas
/usr/local/*
avec/bin
, mais c'est plus une pratique historique. En général, il y a quelques raisons "techniques" pour lesquelles vous ne pouvez pas faire ce que vous proposez.La création de liens vers des exécutables dans
/bin
peut provoquer des problèmes:La plus grande mise en garde serait probablement si votre système a des packages gérés par une sorte de gestionnaire de packages tels que RPM, dpkg, APT, YUM, pacman, pkg_add, etc. Dans ces cas, vous voudrez généralement laisser le package des répertoires tels que gestionnaire faire son travail et à gérer
/sbin
,/bin
,/lib
et/usr
. Une exception serait/usr/local
généralement un endroit sûr pour faire ce que vous jugez bon sur la boîte, sans avoir à vous soucier d'un gestionnaire de paquets qui interfère avec vos fichiers.Souvent, les exécutables construits pour
/usr/local
auront ce PATH codé en dur dans leurs exécutables. Certains fichiers de configuration peuvent également être inclus dans/usr/local
le cadre de l'installation de ces applications. Ainsi, la liaison à l'exécutable peut entraîner des problèmes avec ces applications pour trouver les.cfg
fichiers ultérieurement. Voici un exemple d'un tel cas:Le même problème qui s'applique à la recherche de
.cfg
fichiers peut également se produire avec les exécutables "d'assistance" que l'application principale doit exécuter. Ceux-ci devraient également être liés/usr/bin
, sachant que cela pourrait être problématique et n'apparaître que lorsque vous avez réellement tenté d'exécuter l'application liée.REMARQUE: en général, il est préférable d'éviter la tentation de créer un lien vers des applications uniques dans
/usr/bin
./etc/profile.d
Plutôt alors que tous les utilisateurs fournissent cette gestion, l'administrateur pourrait très facilement l'ajouter à tout le monde
$PATH
sur la boîte en ajoutant un fichier correspondant dans le/etc/profile.d
répertoire.Un fichier comme celui-ci
/etc/profile.d/maven.sh
,:Vous le faites généralement en tant qu'administrateur au lieu de polluer toutes les configurations des utilisateurs avec cela.
Utiliser des alternatives
La plupart des distributions fournissent maintenant un autre outil appelé
alternatives
(Fedora / CentOS) ouupdate-alternatives
(Debian / Ubuntu) que vous pouvez également utiliser pour boucler dans les$PATH
outils qui pourraient être en dehors de/bin
. L'utilisation d'outils tels que ceux-ci est préférable car ils adhèrent davantage à ce que la plupart des administrateurs considéreraient comme une «pratique standard» et rendent ainsi les systèmes plus faciles à transférer d'un administrateur à un autre.Cet outil fait une chose similaire en créant des liens dans
/bin
; mais il gère la création et la destruction de ces liens, il est donc plus facile de comprendre la configuration prévue d'un système lorsqu'elle est effectuée à l'aide d'un outil par rapport à celle effectuée directement comme vous le suggérez.Ici, j'utilise ce système pour gérer le Java d'Oracle sur une boîte:
Vous pouvez voir les effets de ceci:
Mon 0,02 $
L'établissement de liens
/bin
, bien que plausible, serait probablement fortement découragé par la plupart des administrateurs système:la source
/bin
répertoire. Voici un exemple. Sur Red Hat, les distributions qui utilisent RPM si un fichier existe déjà dans/bin
RPM ne s'installeront pas comme vous l'avez décrit, sauf si elles sont obligées de le faire à l'aide du--replacefiles
commutateur. Ce n'est donc pas vraiment une raison technique. Même chose avec les autres répertoires. Je comprends ce que vous dites à propos du "propriétaire" du système d'exploitation,/bin
mais ce n'est pas aussi clair que vous le dites.Répondre aux questions posées:
Non , c'est une mauvaise pratique.
Oui, il y a plusieurs effets secondaires. Votre suggestion peut fonctionner ou non en fonction de l'application, et peut régresser ou être interrompue à long terme.
Il y a des raisons raisonnables de ne pas créer un tel lien symbolique:
Les administrateurs ne sont pas "propriétaires"
/bin
(voir note 1) car ce répertoire appartient aux développeurs de systèmes d'exploitation / de distribution. D'autre part, il/usr/local
s'agit d'un emplacement traditionnel pour les logiciels créés par l'administrateur local,/opt/<packagename>
étant un emplacement pour les logiciels dégroupés. Si vous créez un fichier ou un lien/bin
dedans, il y a un risque qu'il soit écrasé par une installation de package, dans votre cas unmaven
package hypothétique fourni par le système d'exploitation, ce qui peut conduire à une régression si celui construit localement est créé à partir de plus récents code source que la version du système d'exploitation. Par exemple, les tarballs SVR4pkgadd
, debiandpkg
, red-hatrpm
et slackware écraseront aveuglément votre lien symbolique.Certaines applications recherchent l'endroit où elles sont appelées pour récupérer les fichiers de configuration, les plugins et les ressources similaires. Si vous appelez l'application par un lien symbolique, son code risque de ne pas la suivre, puis de rechercher ces fichiers de ressources là
/usr/bin
où ils ne se trouvent pas.Il peut y avoir d'autres fichiers binairesSupprimé car vous prenez déjà cela en compte avec votre commande en liant toutes les commandes potentielles./usr/local/maven/bin
et ne pas ajouter ce répertoire à votre PATH les rendra indisponibles.La page maven2 indique d'ajouter ce répertoire à votre PATH (précisément: Ajoutez la variable d'environnement M2 à votre chemin, par exemple, exportez PATH = $ M2: $ PATH .), En utilisant une approche différente, vous interrompez cette étape, vous passez donc sans support façon. Bien sûr, si la plupart des utilisateurs d'un système sont des
maven
utilisateurs potentiels , il serait plus logique de définirPATH
globalement plutôt que sur chacun.profile
.Note 1:
Documentation de Slackware:
Norme de hiérarchie Debian / système de fichiers
Documentation Solaris:
Un test simple montrant que Debian
dpkg
ne conserve pas un lien existant, même si l'--force-overwrite
option n'est pas utilisée:la source
/bin
ou/usr/bin
. Après avoir découvert les problèmes des binaires système cachés ou détruits (le plus célèbre étaittest
), la meilleure pratique pour installer des binaires non système ailleurs a été progressivement adoptée.Si vous souhaitez créer un lien symbolique, il serait préférable de créer un lien symbolique vers
/usr/local/bin
. Sur mon serveur, j'avais l'habitude d'installer des logiciels locaux/opt/NAME
et de créer des liens symboliques vers les fichiers binaires/usr/local/bin
.la source
Une alternative aux deux méthodes suggérées consiste à créer un script shell dans le
/usr/local/bin
sens où, une fois exécuté, il exécute le binaire que vous spécifiez dans le script. Par exemple, en utilisant maven comme exemple, je créerais un script shell dans/usr/local/bin
appelémaven
qui a un petit script à l'intérieur pour exécuter le binaire maven où il se trouve et lui passer tous les arguments:Cela a l'inconvénient d'avoir à le faire pour chaque binaire que vous souhaitez "lier", mais cela vous permet d'appeler ces fichiers binaires à partir de la ligne de commande sans avoir à nettoyer votre
$PATH
variable d'environnement.la source