Nasz administrator sys zainstalował aplikację (Maven) na serwerze i kazał wszystkim dodać /usr/local/maven/bin/
folder do swojej ścieżki.
Myślę, że wygodniej byłoby po prostu połączyć kilka programów w tym folderze z /bin
folderu (lub innego folderu, który każdy ma na swojej ścieżce) w następujący sposób:
ln -s /usr/local/maven/bin/* /bin
Czy to jest poprawne? Czy są jakieś ukryte skutki uboczne mojej sugestii?
symlink
path
directory-structure
Erel Segal-Halevi
źródło
źródło
/opt
.Odpowiedzi:
Na linkowanie
Ogólnie nie łączysz
/usr/local/*
z/bin
, ale jest to raczej praktyka historyczna. Ogólnie istnieje kilka „technicznych” powodów, dla których nie możesz zrobić tego, co sugerujesz.Tworzenie linków do plików wykonywalnych w
/bin
może powodować problemy:Prawdopodobnie największym zastrzeżeniem byłoby, jeśli system ma pakiety zarządzane przez jakiegoś menedżera pakietów, takiego jak RPM, dpkg, APT, YUM, pacman, pkg_add itp. W takich przypadkach zazwyczaj będziesz chciał pozwolić pakietowi menedżer wykonywać swoje zadania i zarządzać katalogi takie jak
/sbin
,/bin
,/lib
, i/usr
. Jedynym wyjątkiem może być/usr/local
bezpieczne miejsce, które uważasz za stosowne, bez obawy, że menedżer pakietów zakłóci twoje pliki.Często skonstruowane pliki wykonywalne
/usr/local
będą miały na stałe zapisaną PATH w swoich plikach wykonywalnych. Mogą również istnieć pliki konfiguracyjne, które są/usr/local
częścią instalacji tych aplikacji. Zatem połączenie tylko z plikiem wykonywalnym może powodować problemy z wyszukiwaniem.cfg
plików przez aplikacje później. Oto przykład takiego przypadku:Ten sam problem, który dotyczy wyszukiwania
.cfg
plików, może również wystąpić w przypadku plików wykonywalnych „pomocniczych”, które musi uruchomić główna aplikacja. Te również będą musiały być połączone/usr/bin
, wiedząc, że może to być problematyczne i pojawiają się tylko wtedy, gdy faktycznie próbujesz uruchomić połączoną aplikację.UWAGA: ogólnie najlepiej jest unikać pokusy łączenia się z jednorazowymi aplikacjami
/usr/bin
./etc/profile.d
Zamiast tego wszyscy użytkownicy zapewniają to zarządzanie, administrator może bardzo łatwo dodać to do wszystkich w
$PATH
polu, dodając odpowiedni plik w/etc/profile.d
katalogu.Plik taki jak ten
/etc/profile.d/maven.sh
:Generalnie robisz to jako administrator, zamiast zanieczyszczać tym konfiguracje wszystkich użytkowników.
Korzystanie z alternatyw
Większość dystrybucji zawiera teraz inne narzędzie o nazwie
alternatives
(Fedora / CentOS) lubupdate-alternatives
(Debian / Ubuntu), którego można również użyć do zapętlenia$PATH
narzędzi, które mogą znajdować się poza/bin
. Preferowane jest korzystanie z takich narzędzi, ponieważ są one bardziej zgodne z tym, co większość administratorów uważa za „standardową praktykę”, a tym samym ułatwia przekazywanie systemów od jednego administratora do drugiego.To narzędzie działa podobnie do tworzenia linków
/bin
; ale zarządza tworzeniem i niszczeniem tych łączy, więc łatwiej jest zrozumieć zamierzoną konfigurację systemu, gdy jest wykonywana za pomocą narzędzia, a nie bezpośrednio, jak sugerujesz.Tutaj używam tego systemu do zarządzania Javą Oracle na pudełku:
Możesz zobaczyć efekty tego:
Moje 0,02 $
Udostępnianie linków
/bin
, choć prawdopodobne, byłoby wysoce zniechęcone przez większość sysadminów:źródło
/bin
katalogu. Oto przykład. W dystrybucjach Red Hat, które wykorzystują RPM, jeśli plik już istnieje w/bin
RPM, nie zostanie zainstalowany tak, jak opisano powyżej, chyba że zostanie to zrobione przy użyciu--replacefiles
przełącznika. To nie jest tak naprawdę powód techniczny. To samo z innymi katalogami. Rozumiem, co mówisz o „posiadaniu” systemu operacyjnego,/bin
ale nie jest to tak proste, jak twierdzisz.Odpowiedzi na zadane pytania:
Nie , to zła praktyka.
Tak, istnieje kilka efektów ubocznych. Twoja sugestia może działać lub nie w zależności od aplikacji i może się cofnąć lub zostać zerwana w dłuższej perspektywie.
Istnieją uzasadnione powody, aby nie tworzyć takiego dowiązania symbolicznego:
Administratorzy nie są „właścicielami”
/bin
(patrz uwaga 1), ponieważ katalog ten należy do twórców systemów operacyjnych / dystrybucji. Z drugiej strony/usr/local
jest to tradycyjna lokalizacja dla oprogramowania zbudowana przez lokalnego administratora,/opt/<packagename>
która jest dla oprogramowania wydzielonego. Jeśli utworzysz plik lub łącze/bin
, istnieje ryzyko zastąpienia go instalacją pakietu, w twoim przypadku hipotetycznymmaven
pakietem dostarczonym przez system operacyjny, co może prowadzić do regresji, jeśli lokalnie zbudowany jest nowszy kod źródłowy w wersji systemu operacyjnego. Na przykład, pliki tar SVR4pkgadd
, debiandpkg
, red-hatrpm
i slackware w oślepiający sposób zastąpią twój symboliczny link.Niektóre aplikacje szukają miejsca, w którym są wywoływane, w celu pobrania plików konfiguracyjnych, wtyczek i podobnych zasobów. Jeśli wywołasz aplikację za pomocą dowiązania symbolicznego, jej kod może nie podążać za nią, a następnie poszukać tych plików zasobów,
/usr/bin
których nie ma.Mogą istnieć inne pliki binarne,Usunięto, ponieważ uwzględniono to już w poleceniu, łącząc wszystkie potencjalne polecenia./usr/local/maven/bin
a brak dodania tego katalogu do ŚCIEŻKI spowoduje, że będą one niedostępne.Strona maven2 mówi, aby dodać ten katalog do ŚCIEŻKI (dokładnie: dodaj zmienną środowiskową M2 do swojej ścieżki, np. Eksport ŚCIEŻKA = $ M2: $ ŚCIEŻKA .), Stosując inne podejście, przełamujesz ten krok, więc przejdziesz nieobsługiwany droga. Oczywiście, jeśli większość użytkowników systemu jest potencjalnymi
maven
użytkownikami, sensowniejsze byłoby ustawieniePATH
globalne zamiast dla każdego z nich.profile
.Notatka 1:
Dokumentacja Slackware:
Debian / Fileystem Hierarchy Standard
Dokumentacja Solaris:
Prosty test pokazujący, że Debian
dpkg
nie zachowuje istniejącego linku, nawet jeśli--force-overwrite
opcja nie jest używana:źródło
/bin
lub/usr/bin
. Po odkryciu problemów związanych z ukrytymi lub rozproszonymi plikami binarnymi systemu (najbardziej znana byłatest
), stopniowo wprowadzano najlepsze praktyki instalowania plików binarnych niesystemowych w innym miejscu.Jeśli chcesz utworzyć dowiązanie symboliczne, lepiej byłoby dowiązanie symboliczne
/usr/local/bin
. Na moim serwerze instalowałem lokalne oprogramowanie/opt/NAME
i łączyłem pliki binarne z nimi/usr/local/bin
.źródło
Alternatywą dla dwóch sugerowanych metod jest utworzenie skryptu powłoki, w
/usr/local/bin
którym po uruchomieniu wykonuje dowolny plik binarny określony w skrypcie. Na przykład, używając maven jako przykładu, stworzyłbym skrypt powłoki w/usr/local/bin
wywołanym,maven
który ma mały skrypt wewnątrz, aby wykonać plik binarny maven, w którym się znajduje, i przekazać do niego wszelkie argumenty:Ma to tę wadę, że musi to robić dla każdego pliku binarnego, który chcesz „połączyć”, ale pozwala na wywoływanie tych plików binarnych z wiersza poleceń bez konieczności usuwania
$PATH
zmiennej środowiskowej.źródło