20 poleceń Linuksa każdy sysadmin powinien znać

w świecie pełnym nowych narzędzi i zróżnicowanych środowisk programistycznych, praktycznie każdy programista lub inżynier musi nauczyć się podstawowych poleceń sysadmina. Konkretne polecenia i pakiety mogą pomóc programistom w organizowaniu, rozwiązywaniu problemów i optymalizacji ich aplikacji, a także—gdy coś pójdzie nie tak—dostarczać cennych informacji dotyczących oceny operatorów i administratorów systemu.

niezależnie od tego, czy jesteś nowym programistą, czy chcesz zarządzać własną aplikacją, poniższe 20 podstawowych poleceń sysadmin pomoże Ci lepiej zrozumieć Twoje aplikacje. Mogą one również pomóc w opisywaniu problemów administratorom systemu w rozwiązywaniu problemów, dlaczego aplikacja może działać lokalnie, ale nie na zdalnym hoście. Polecenia te dotyczą środowisk programistycznych Linuksa, kontenerów, maszyn wirtualnych (VM) i bare metal.

curl

curl przenosi URL. Użyj tego polecenia, aby przetestować punkt końcowy aplikacji lub łączność z punktem końcowym usługi. curl może być przydatny do określenia, czy aplikacja może dotrzeć do innej usługi, takiej jak Baza Danych, lub sprawdzenia, czy usługa jest zdrowa.

na przykład wyobraź sobie, że Twoja aplikacja wyświetla błąd HTTP 500 wskazujący, że nie może dotrzeć do bazy danych MongoDB:

$ curl -I -s myapplication:5000
HTTP/1.0 500 INTERNAL SERVER ERROR

opcja-i pokazuje informacje o nagłówku, a opcja-s wycisza treść odpowiedzi. Sprawdzanie punktu końcowego bazy danych z lokalnego pulpitu:

$ curl -I -s database:27017
HTTP/1.0 200 OK

więc w czym może być problem? Sprawdź, czy aplikacja może dostać się do innych miejsc poza bazą danych z hosta aplikacji:

$ curl -I -s https://opensource.com
HTTP/1.1 200 OK

to chyba ok. Teraz spróbuj dotrzeć do bazy danych z hosta aplikacji. Twoja aplikacja używa nazwy hosta bazy danych, więc spróbuj najpierw:

$ curl database:27017
curl: (6) Couldn't resolve host 'database'

oznacza to, że aplikacja nie może rozwiązać bazy danych, ponieważ adres URL bazy danych jest niedostępny lub host (kontener lub maszyna wirtualna) nie ma serwera nazw, którego może użyć do rozwiązania nazwy hosta.

python-m json.tool / jq

po wydaniu curl, wynik wywołania API może być trudny do odczytania. Czasami chcesz ładnie wydrukować wyjście JSON, aby znaleźć konkretny wpis. Python ma wbudowaną bibliotekę JSON, która może w tym pomóc. Używasz python-m json.narzędzie do wcięć i organizowania JSON. Aby użyć modułu JSON Pythona, przeprowadź wyjście pliku JSON do python-m json.polecenie Narzędzia.

$ cat test.json
{"title":"Person","type":"object","properties":{"firstName":{"type":"string"},"lastName":{"type":"string"},"age":{"description":"Age in years","type":"integer","minimum":0}},"required":}

aby użyć biblioteki Pythona, przeprowadź wyjście do Pythona za pomocą opcji-m (module).

$ cat test.json | python -m json.tool
{
"properties": {
"age": {
"description": "Age in years",
"minimum": 0,
"type": "integer"
},
"firstName": {
"type": "string"
},
"lastName": {
"type": "string"
}
},
"required": ,
"title": "Person",
"type": "object"
}

aby uzyskać bardziej zaawansowane przetwarzanie JSON, możesz zainstalować jq. jq udostępnia kilka opcji, które wyodrębniają określone wartości z wejścia JSON. Aby ładnie wydrukować, jak powyższy moduł Pythona, po prostu zastosuj jq do wyjścia.

$ cat test.json | jq
{
"title": "Person",
"type": "object",
"properties": {
"firstName": {
"type": "string"
},
"lastName": {
"type": "string"
},
"age": {
"description": "Age in years",
"type": "integer",
"minimum": 0
}
},
"required":
}

ls

LS wyświetla pliki w katalogu. Sysadmins i deweloperzy wydają to polecenie dość często. W przestrzeni kontenera to polecenie może pomóc w określeniu katalogu i plików obrazu kontenera. Poza przeglądaniem plików, ls może pomóc ci sprawdzić uprawnienia. W poniższym przykładzie nie możesz uruchomić myapp z powodu problemu z uprawnieniami. Kiedy sprawdzasz uprawnienia za pomocą ls-l, zdajesz sobie sprawę, że uprawnienia nie mają „x” w-RW-r–r–, które są tylko do odczytu i zapisu.

$ ./myapp
bash: ./myapp: Permission denied
$ ls -l myapp
-rw-r--r--. 1 root root 33 Jul 21 18:36 myapp

tail

tail wyświetla ostatnią część pliku. Zwykle nie potrzebujesz każdej linii dziennika do rozwiązywania problemów. Zamiast tego chcesz sprawdzić, co dzienniki mówią o ostatnim żądaniu do aplikacji. Na przykład możesz użyć ogona, aby sprawdzić, co dzieje się w dziennikach podczas wysyłania żądania do serwera HTTP Apache.

example_tail.png

użyj tail-f, aby śledzić dzienniki serwera Apache HTTP i zobaczyć żądania w miarę ich występowania.

użyj tail-f, aby śledzić dzienniki HTTP Apache i zobaczyć żądania w miarę ich występowania.

opcja-f wskazuje opcję „follow”, która wyświetla linie dziennika, gdy są one zapisywane do pliku. Przykład zawiera skrypt w tle, który uzyskuje dostęp do punktu końcowego co kilka sekund, a dziennik rejestruje żądanie. Zamiast śledzić dziennik w czasie rzeczywistym, Możesz również użyć tail, aby zobaczyć ostatnie 100 linii pliku z opcją-n.

$ tail -n 100 /var/log/httpd/access_log

cat

cat łączy i drukuje pliki. Możesz wydać cat, aby sprawdzić zawartość pliku zależności lub potwierdzić wersję aplikacji, która została już zbudowana lokalnie.

$ cat requirements.txt
flask
flask_pymongo

powyższy przykład sprawdza, czy Twoja aplikacja Python Flask ma Flask wymienione jako zależność.

grep

grep wyszukuje wzorce plików. Jeśli szukasz konkretnego wzorca na wyjściu innego polecenia, grep podświetla odpowiednie linie. Użyj tego polecenia do przeszukiwania plików dziennika, określonych procesów i innych. Jeśli chcesz sprawdzić, czy Apache Tomcat się uruchamia, możesz zostać przytłoczony liczbą linii. Wysyłając to wyjście do polecenia grep, izolujesz linie wskazujące uruchomienie serwera.

$ cat tomcat.log | grep org.apache.catalina.startup.Catalina.start
01-Jul-2017 18:03:47.542 INFO org.apache.catalina.startup.Catalina.start Server startup in 681 ms

ps

polecenie ps, część pakietu procps-ng, która dostarcza użytecznych poleceń do badania identyfikatorów procesów, pokazuje stan działającego procesu. Użyj tego polecenia, aby określić uruchomioną aplikację lub potwierdzić oczekiwany proces. Na przykład, jeśli chcesz sprawdzić, czy działa serwer internetowy Tomcat, użyj ps z opcjami, aby uzyskać identyfikator procesu Tomcat.

$ ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 2 18:55 ? 00:00:02 /docker-java-home/jre/bi
root 59 0 0 18:55 pts/0 00:00:00 /bin/sh
root 75 59 0 18:57 pts/0 00:00:00 ps -ef

aby uzyskać jeszcze większą czytelność, użyj ps i podłącz go do grep.

$ ps -ef | grep tomcat
root 1 0 1 18:55 ? 00:00:02 /docker-java-home/jre/bi

env

env pozwala ustawić lub wydrukować zmienne środowiskowe. Podczas rozwiązywania problemów może okazać się przydatna do sprawdzania, czy Niewłaściwa zmienna środowiskowa uniemożliwia uruchomienie aplikacji. W poniższym przykładzie polecenie to służy do sprawdzania zmiennych środowiskowych ustawionych na hoście aplikacji.

$ env
PYTHON_PIP_VERSION=9.0.1
HOME=/root
DB_NAME=test
PATH=/usr/local/bin:/usr/local/sbin
LANG=C.UTF-8
PYTHON_VERSION=3.4.6
PWD=/
DB_URI=mongodb://database:27017/test

zauważ, że aplikacja używa Pythona i ma zmienne środowiskowe do łączenia się z bazą danych MongoDB.

top

top wyświetla i aktualizuje posortowane informacje o procesie. Użyj tego narzędzia do monitorowania, aby określić, które procesy są uruchomione oraz ile pamięci i procesora zużywają. Częsty przypadek występuje, gdy uruchamiasz aplikację, która umiera minutę później. Najpierw sprawdzasz błąd powrotu aplikacji, który jest błędem pamięci.

$ tail myapp.log
Traceback (most recent call last):
MemoryError

czy Twoja aplikacja naprawdę traci pamięć? Aby potwierdzić, użyj top, aby określić, ile procesora i pamięci zużywa Twoja aplikacja. Wydając top, zauważysz aplikację Pythona używającą większości procesora, a jej zużycie pamięci rośnie i podejrzewasz, że jest to Twoja aplikacja. Podczas jego działania naciskasz klawisz „C”, aby zobaczyć pełne polecenie i inżynierię wsteczną, jeśli Proces jest Twoją aplikacją. Okazuje się, że jest to aplikacja intensywnie wykorzystująca pamięć (memeater.py). gdy aplikacji zabraknie pamięci, system uśmierca ją błędem out-of-memory (OOM).

example_top.png

 wystawianie top przeciwko aplikacji, która zużywa całą swoją pamięć.

zwiększa się zużycie pamięci i procesora w aplikacji, w końcu jest OOM-zabity.

example_topwithc.png

 naciśnięcie C podczas uruchamiania góry pokazuje pełne polecenie

naciskając klawisz „C”, możesz zobaczyć pełne polecenie, które uruchomiło aplikację.

oprócz sprawdzania własnej aplikacji, możesz użyć top do debugowania innych procesów, które wykorzystują procesor lub pamięć.

netstat

netstat pokazuje stan sieci. Polecenie to pokazuje używane porty sieciowe i ich połączenia przychodzące. Jednak netstat nie wychodzi z pudełka pod Linuksem. Jeśli chcesz go zainstalować, możesz go znaleźć w pakiecie net-tools. Jako programista, który eksperymentuje lokalnie lub wypycha aplikację na host, może pojawić się błąd, że port jest już przydzielony lub adres jest już używany. Użycie netstat z opcjami protokołu, procesu i portu pokazuje, że serwer HTTP Apache używa już Portu 80 na poniższym hoście.

example_netstat.png

 netstat sprawdza, czy Apache działa na porcie 80

użycie netstat-tulpn pokazuje, że Apache używa już Portu 80 na tym komputerze.

ip

jeśli adres ip nie działa na Twoim hoście, musi być zainstalowany z pakietem iproute2. Adres podrzędny (lub w skrócie ip a) pokazuje interfejsy i adresy IP hosta Twojej aplikacji. Używasz adresu ip do weryfikacji adresu IP kontenera lub hosta. Na przykład, gdy kontener jest podłączony do dwóch sieci, adres ip może pokazać, który Interfejs łączy się z którą siecią. Dla prostego sprawdzenia, zawsze możesz użyć polecenia adres ip, aby uzyskać adres IP hosta. Poniższy przykład pokazuje, że kontener warstwy sieci Web ma adres IP 172.17.0.2 w interfejsie eth0.

$ ip address show eth0
3: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether d4:3b:04:9e:b2:c2 brd ff:ff:ff:ff:ff:ff
inet 10.1.1.3/27 brd 10.1.1.31 scope global dynamic noprefixroute eth0
valid_lft 52072sec preferred_lft 52072sec

lsof

lsof wyświetla listę otwartych plików powiązanych z Twoją aplikacją. Na niektórych obrazach maszyn Linuksowych musisz zainstalować lsof z pakietem lsof. W Linuksie prawie każda interakcja z systemem jest traktowana jak plik. W rezultacie, jeśli aplikacja zapisuje do pliku lub otworzy połączenie sieciowe, lsof będzie odzwierciedlać tę interakcję jako plik. Podobnie jak w przypadku netstat, możesz użyć lsof do sprawdzenia portów nasłuchujących. Na przykład, jeśli chcesz sprawdzić, czy port 80 jest używany, użyj lsof, aby sprawdzić, który Proces go używa. Poniżej widać, że httpd (Apache) nasłuchuje na porcie 80. Możesz także użyć lsof, aby sprawdzić ID procesu httpd, sprawdzając, gdzie znajduje się plik binarny serwera www (/usr/sbin / httpd).

example_lsof.png

 lsof ujawnia pochodzenie informacji o procesie

lsof pokazuje, że httpd nasłuchuje na porcie 80. Badanie identyfikatora procesu httpd pokazuje również wszystkie pliki potrzebne httpd do uruchomienia.

nazwa otwartego pliku na liście otwartych plików pomaga wskazać pochodzenie procesu, w szczególności Apache.

df

możesz użyć df (wyświetl wolne miejsce na dysku), aby rozwiązać problemy z miejscem na dysku. Podczas uruchamiania aplikacji na orchestratorze kontenerów może pojawić się komunikat o błędzie informujący o braku wolnego miejsca na hoście kontenera. Podczas gdy przestrzeń dyskowa powinna być zarządzana i optymalizowana przez sysadmin, możesz użyć df, aby dowiedzieć się o istniejącej przestrzeni w katalogu i potwierdzić, czy rzeczywiście brakuje miejsca.

$ df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 7.7G 0 7.7G 0% /dev
/dev/mapper/RHEL-Root 50G 16G 35G 31% /
/dev/nvme0n1p2 3.0G 246M 2.8G 9% /boot
/dev/mapper/RHEL-Home 100G 88G 13G 88% /home
/dev/nvme0n1p1 200M 9.4M 191M 5% /boot/efi
/dev/sdb1 114G 55G 54G 51% /run/media/tux/red

opcja-h wypisuje informacje w formacie czytelnym dla człowieka. Domyślnie, tak jak w przykładzie, df dostarcza wyniki dla wszystkiego, co znajduje się w katalogu głównym, ale możesz również ograniczyć wyniki, udostępniając katalog jako część polecenia (np.

du

aby uzyskać bardziej szczegółowe informacje o tym, które Pliki używają miejsca na dysku w katalogu, możesz użyć polecenia du. Jeśli chcesz dowiedzieć się, który dziennik zajmuje najwięcej miejsca w katalogu /var/log, możesz użyć du z opcją-h (czytelną dla człowieka) i opcją-s dla całkowitego rozmiaru.

$ du -sh /var/log/*
1.8M /var/log/anaconda
384K /var/log/audit
4.0K /var/log/boot.log
0 /var/log/chrony
4.0K /var/log/cron
4.0K /var/log/maillog
64K /var/log/messages

powyższy przykład ujawnia największy katalog w /var/log jako /var/log/audit. Możesz użyć du w połączeniu z df, aby określić, co wykorzystuje miejsce na dysku na hoście aplikacji.

id

aby sprawdzić użytkownika uruchamiającego aplikację, użyj polecenia id, aby zwrócić tożsamość użytkownika. Poniższy przykład wykorzystuje Vagrant do testowania aplikacji i izolowania jej środowiska programistycznego. Po zalogowaniu się do Vagrant box, jeśli spróbujesz zainstalować serwer HTTP Apache (zależność), system stwierdzi, że nie możesz wykonać polecenia jako root. Aby sprawdzić użytkownika i grupę, wydaj polecenie id i zauważ, że jesteś użytkownikiem ” vagrant „w grupie” vagrant”.

$ dnf -y install httpd
Loaded plugins: fastestmirror
You need to be root to perform this command.
$ id
uid=1000(vagrant) gid=1000(vagrant) groups=1000(vagrant) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

aby to naprawić, musisz uruchomić polecenie jako superużytkownik, który zapewnia podwyższone uprawnienia.

chmod

po pierwszym uruchomieniu programu binarnego na hoście może pojawić się komunikat o błędzie „Permission denied.”Jak widać w przykładzie dla ls, możesz sprawdzić uprawnienia binarne aplikacji.

$ ls -l
total 4
-rw-rw-r--. 1 vagrant vagrant 34 Jul 11 02:17 test.sh

to pokazuje, że nie masz praw do wykonania (nie ma „x”), aby uruchomić plik binarny. chmod może poprawić uprawnienia, aby umożliwić użytkownikowi uruchomienie pliku binarnego.

$ chmod +x test.sh
$ ls -l
total 4
-rwxrwxr-x. 1 vagrant vagrant 34 Jul 11 02:17 test.sh

jak pokazano w przykładzie, aktualizuje to uprawnienia o prawa wykonawcze. Teraz, gdy próbujesz uruchomić plik binarny, aplikacja nie wyświetla błędu odmowy uprawnień. Chmod może być przydatny również w przypadku załadowania pliku binarnego do kontenera. Zapewnia to, że Twój kontener ma odpowiednie uprawnienia do uruchomienia pliku binarnego.

dig / nslookup

serwer nazw domen (DNS) pomaga rozwiązać adres URL do zestawu serwerów aplikacji. Może się jednak okazać, że adres URL nie rozwiązuje się, co powoduje problem z łącznością w aplikacji. Załóżmy na przykład, że próbujesz uzyskać dostęp do bazy danych pod adresem URL bazy danych mydatabase z hosta aplikacji. Zamiast tego wyświetlany jest błąd „nie można rozwiązać”. Aby rozwiązać problem, spróbuj użyć dig (narzędzie wyszukiwania DNS) lub nslookup (zapytanie internetowe serwery nazw), aby dowiedzieć się, dlaczego aplikacja nie może rozwiązać bazy danych.

$ nslookup mydatabase
Server: 10.0.2.3
Address: 10.0.2.3#53
** server can't find mydatabase: NXDOMAIN

użycie nslookup pokazuje, że mydatabase nie może zostać rozwiązany. Próba rozwiązania z dig daje ten sam rezultat.

$ dig mydatabase
; <<>> DiG 9.9.4-RedHat-9.9.4-50.el7_3.1 <<>> mydatabase
;; global options: +cmd
;; connection timed out; no servers could be reached

te błędy mogą być spowodowane przez wiele różnych problemów. Jeśli nie możesz debugować głównej przyczyny, skontaktuj się z sysadminem, aby uzyskać więcej informacji. W przypadku testów lokalnych ten problem może wskazywać, że serwery nazw twojego hosta nie są odpowiednio skonfigurowane. Aby użyć tych poleceń, musisz zainstalować pakiet BIND Utilities.

firewall-cmd

tradycyjnie zapory sieciowe były konfigurowane pod Linuksem za pomocą polecenia iptables I chociaż zachowują swoją wszechobecność, w rzeczywistości zostały w dużej mierze zastąpione przez nftables. Przyjazny front-end dla nftables i ten, który domyślnie jest dostarczany z wieloma dystrybucjami, to firewall-cmd. To polecenie pomaga skonfigurować reguły regulujące ruch sieciowy, zarówno wychodzący, jak i przychodzący, na który pozwala komputer. Reguły te można pogrupować w strefy, dzięki czemu można szybko i łatwo przenosić się z jednego zestawu reguł do drugiego, w zależności od wymagań.

składnia polecenia jest prosta. Używasz polecenia i pewnej liczby opcji, z których wszystkie są nazwane w sposób, który pomaga prawie zbudować zdanie czytelne dla człowieka. Na przykład, aby zobaczyć, w jakiej strefie aktualnie się znajdujesz:

$ sudo firewall-cmd --get-active-zones``
corp
interfaces: ens0
dmz
interfaces: ens1

w tym przykładzie komputer ma dwa urządzenia sieciowe, z których jedno jest przypisane do strefy corp, a drugie do strefy dmz.

aby zobaczyć, na co pozwala każda strefa, możesz użyć opcji --list-all :

$ sudo firewall-cmd --zone corp --list-all
corp
target: default
interfaces: ens0
services: cockpit dhcpv6-client ssh
ports:
protocols:

Dodawanie usług jest równie proste:

$ sudo firewall-cmd --add-service http --permanent
$ sudo firewall-cmd --reload

interakcja z firewallem-cmd jest zaprojektowana tak, aby była intuicyjna i ma obszerny zbiór wstępnie zmodyfikowanych usług, a także możliwość bezpośredniego pisania reguł nft. Po rozpoczęciu korzystania z firewall-cmd możesz pobrać naszą ściągawkę firewall-cmd, aby pomóc Ci zapamiętać najważniejsze opcje.

sestatus

zazwyczaj SELinux (Moduł bezpieczeństwa Linuksa) jest wymuszany na hoście aplikacji zarządzanym przez przedsiębiorstwo. SELinux zapewnia najmniej uprzywilejowany dostęp do procesów uruchomionych na hoście, zapobiegając potencjalnie szkodliwym procesom dostępu do ważnych plików w systemie. W niektórych sytuacjach aplikacja musi uzyskać dostęp do określonego pliku, ale może spowodować błąd. Aby sprawdzić, czy SELinux blokuje aplikację, użyj tail i grep, aby wyszukać wiadomość „denied” w logowaniu/var/log / audit. W przeciwnym razie możesz sprawdzić, czy pole ma włączone SELinux, używając sestatus.

$ sestatus
SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
SELinux root directory: /etc/selinux
Loaded policy name: targeted
Current mode: enforcing
Mode from config file: enforcing
Policy MLS status: enabled
Policy deny_unknown status: allowed
Max kernel policy version: 28

powyższe wyjście wskazuje, że host aplikacji ma włączony SELinux. W lokalnym środowisku programistycznym możesz zaktualizować SELinux, aby był bardziej permisywny. Jeśli potrzebujesz pomocy z hostem zdalnym, sysadmin pomoże Ci określić najlepszą praktykę zezwalania aplikacji na dostęp do pliku, którego potrzebuje. Jeśli często kontaktujesz się z SELinux, pobierz nasz arkusz ściągający SELinux w celu uzyskania szybkiego odniesienia.

historia

kiedy wydajesz tak wiele poleceń do testowania i debugowania, możesz zapomnieć o przydatnych! Każda powłoka ma wariant polecenia historia. Pokazuje historię poleceń wydanych od początku sesji. Za pomocą historii można rejestrować polecenia używane do rozwiązywania problemów z aplikacją. Na przykład, gdy wystawiasz historię w trakcie tego artykułu, pokazuje ona różne polecenia, z którymi eksperymentowałeś i których się nauczyłeś.

$ history
1 clear
2 df -h
3 du

co zrobić, jeśli chcesz wykonać polecenie w poprzedniej historii, ale nie chcesz go ponownie wpisywać? Użyj ! przed numerem polecenia do ponownego wykonania.

example_history.png

 ponownie wykonaj polecenie w historii

dodawanie ! zanim numer polecenia, które chcesz wykonać, ponownie wyda polecenie.

podstawowe polecenia mogą zwiększyć Twoją wiedzę na temat rozwiązywania problemów przy określaniu, dlaczego Twoja aplikacja działa w jednym środowisku programistycznym, ale być może nie w innym. Wielu administratorów używa tych poleceń do debugowania problemów z systemami. Zrozumienie niektórych z tych przydatnych poleceń rozwiązywania problemów może pomóc w komunikacji z administratorami systemu i rozwiązywaniu problemów z aplikacją.



+