Elke systeembeheerder zou

moeten kennen In een wereld boordevol nieuwe tools en diverse ontwikkelomgevingen, is het praktisch een noodzaak voor elke ontwikkelaar of ingenieur om een aantal basis systeembeheerder commando ‘ s te leren. Specifieke commando ‘ s en pakketten kunnen ontwikkelaars helpen hun applicaties te organiseren, problemen op te lossen en te optimaliseren en—als er iets mis gaat—waardevolle triage-informatie te verstrekken aan operators en systeembeheerders.

of u nu een nieuwe ontwikkelaar bent of uw eigen toepassing wilt beheren, de volgende 20 basiscommando ‘ s voor systeembeheer kunnen u helpen uw toepassingen beter te begrijpen. Ze kunnen u ook helpen problemen te beschrijven voor systeembeheerders problemen oplossen waarom een toepassing lokaal zou kunnen werken, maar niet op een externe host. Deze commando ’s zijn van toepassing op Linux ontwikkelomgevingen, containers, virtuele machines (VM’ s) en bare metal.

krul

krul geeft een URL door. Gebruik deze opdracht om het eindpunt van een toepassing of de verbinding met een upstream service-eindpunt te testen. curl kan handig zijn om te bepalen of uw applicatie een andere service kan bereiken, zoals een database, of om te controleren of uw service gezond is.

als voorbeeld, stel je voor dat je applicatie een HTTP 500-fout geeft die aangeeft dat het geen MongoDB-database kan bereiken:

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

de optie-I toont de header-informatie en de optie-s schakelt het antwoordlichaam uit. Het eindpunt van uw database controleren vanaf uw lokale bureaublad:

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

dus wat kan het probleem zijn? Controleer of uw applicatie naar andere plaatsen naast de database van de applicatie host kan krijgen:

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

dat lijkt in orde. Probeer nu de database te bereiken vanaf de applicatie host. Uw applicatie gebruikt de hostnaam van de database, dus probeer dat eerst:

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

dit geeft aan dat uw toepassing de database niet kan oplossen omdat de URL van de database niet beschikbaar is of de host (container of VM) geen nameserver heeft die gebruikt kan worden om de hostnaam op te lossen.

python-m json.tool / jq

nadat u curl hebt uitgegeven, kan de uitvoer van de API-aanroep moeilijk te lezen zijn. Soms wilt u de JSON-uitvoer mooi afdrukken om een specifiek item te vinden. Python heeft een ingebouwde JSON bibliotheek die kan helpen met dit. Je gebruikt python-m json.hulpmiddel om de JSON te inspringen en te organiseren. Om Python ‘ s JSON module te gebruiken, pipe de uitvoer van een JSON bestand in de python-m json.gereedschapsopdracht.

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

om de Python bibliotheek te gebruiken, pipe de uitvoer naar Python met de-m (module) optie.

$ 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"
}

voor meer geavanceerde JSON parsing, kunt u JQ installeren. jq biedt een aantal opties die specifieke waarden extraheren uit de JSON-invoer. Om pretty-print zoals de Python module hierboven, gewoon JQ toepassen op de uitvoer.

$ 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 toont bestanden in een map. Systeembeheerders en ontwikkelaars geven dit commando vrij vaak uit. In de containerruimte kan dit commando helpen bij het bepalen van de map en bestanden van uw containerafbeelding. Naast het opzoeken van uw bestanden, ls kan u helpen uw rechten te onderzoeken. In het onderstaande voorbeeld kunt u myapp niet uitvoeren vanwege een probleem met Machtigingen. Wanneer je de permissies controleert met behulp van ls-l, realiseer je je dat de permissies geen “x” hebben in-rw-r–r–, die alleen lezen en schrijven zijn.

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

tail

tail geeft het laatste deel van een bestand weer. Je hebt meestal niet elke logregel nodig om problemen op te lossen. In plaats daarvan wilt u controleren wat uw logboeken zeggen over de meest recente aanvraag voor uw toepassing. Bijvoorbeeld, je kunt tail gebruiken om te controleren wat er gebeurt in de logs wanneer je een aanvraag doet bij je Apache HTTP server.

voorbeeldstaart.png

gebruik tail-f om de Apache HTTP server logs te volgen en de verzoeken te zien zoals ze gebeuren.

gebruik tail-f om Apache HTTP logs te volgen en de verzoeken te zien zoals ze gebeuren.

de optie-f geeft de optie” follow ” aan, die de logregels uitvoert terwijl ze naar het bestand worden geschreven. Het voorbeeld heeft een achtergrondscript dat om de paar seconden toegang heeft tot het eindpunt en het logboek registreert de aanvraag. In plaats van het log in real time te volgen, kun je ook tail gebruiken om de laatste 100 regels van het bestand te zien met de-n optie.

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

cat

cat concateneert en drukt bestanden af. Je zou cat kunnen geven om de inhoud van je afhankelijkheden bestand te controleren of om de versie van de applicatie te bevestigen die je al lokaal hebt gebouwd.

$ cat requirements.txt
flask
flask_pymongo

het voorbeeld hierboven controleert of uw Python-kolf-toepassing een kolf heeft die als een afhankelijkheid wordt vermeld.

grep

grep zoekt naar bestandspatronen. Als je op zoek bent naar een specifiek patroon in de uitvoer van een ander commando, dan accentueert grep de relevante regels. Gebruik deze opdracht voor het doorzoeken van logbestanden, specifieke processen en meer. Als je wilt zien of Apache Tomcat opstart, kun je overweldigd raken door het aantal regels. Door die uitvoer door te sluizen naar het grep Commando, isoleer je de regels die aangeven dat de server opstart.

$ 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

het ps-commando, onderdeel van het procps-ng-pakket dat nuttige commando ’s biedt voor het onderzoeken van proces-id’ s, toont de status van een lopend proces. Gebruik deze opdracht om een draaiende toepassing te bepalen of een verwacht proces te bevestigen. Als u bijvoorbeeld wilt controleren op een actieve Tomcat-webserver, gebruikt u ps met zijn opties om het proces-ID van Tomcat te verkrijgen.

$ 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

voor nog meer leesbaarheid, gebruik ps en pijp het naar grep.

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

env

met env kunt u de omgevingsvariabelen instellen of afdrukken. Tijdens het oplossen van problemen kunt u het nuttig vinden om te controleren of de verkeerde omgevingsvariabele voorkomt dat uw toepassing start. In het voorbeeld hieronder wordt dit commando gebruikt om de omgevingsvariabelen te controleren die zijn ingesteld op de host van je toepassing.

$ 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

merk op dat de toepassing Python gebruikt en omgevingsvariabelen heeft om verbinding te maken met een MongoDB-database.

top

top geeft gesorteerde procesinformatie weer en werkt deze bij. Gebruik deze monitoring tool om te bepalen welke processen worden uitgevoerd en hoeveel geheugen en CPU ze verbruiken. Een veel voorkomend geval doet zich voor wanneer u een toepassing uitvoert en het sterft een minuut later. Eerst controleert u de retourfout van de toepassing, wat een geheugenfout is.

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

heeft uw toepassing echt onvoldoende geheugen? Om te bevestigen, Gebruik top om te bepalen hoeveel CPU en geheugen uw toepassing verbruikt. Bij de uitgifte van top, merkt u een Python applicatie met behulp van de meeste van de CPU, met het geheugengebruik klimmen, en vermoeden dat het uw toepassing. Terwijl het wordt uitgevoerd, druk je op de” C ” toets om het volledige commando en reverse-engineer zien als het proces is uw toepassing. Het blijkt je geheugenintensieve applicatie te zijn (memeater.py). wanneer uw applicatie heeft een tekort aan geheugen, het systeem doodt het met een out-of-memory (OOM) fout.

voorbeeldtop.png

geeft top af tegen een toepassing die al zijn geheugen verbruikt.

het geheugen en CPU gebruik van de applicatie toeneemt, uiteindelijk wordt OOM-gedood.

voorbeeld_topwithc.png

door op C te drukken tijdens het uitvoeren van top wordt het volledige commando weergegeven

door op de “C” toets te drukken, kunt u het volledige commando zien dat de toepassing is gestart.

naast het controleren van uw eigen toepassing, kunt u top gebruiken om andere processen die CPU of geheugen gebruiken debuggen.

netstat

netstat geeft de netwerkstatus weer. Dit commando toont de gebruikte netwerkpoorten en hun inkomende verbindingen. Echter, netstat komt niet uit de doos op Linux. Als je het moet installeren, kun je het vinden in het net-tools pakket. Als een ontwikkelaar die lokaal experimenteert of een toepassing naar een host pusht, kunt u een fout krijgen dat een poort al is toegewezen of dat een adres al in gebruik is. Het gebruik van netstat met protocol, proces en poort opties laat zien dat Apache HTTP server al poort 80 gebruikt op de onderstaande host.

voorbeeld_netstat.png

netstat controleert of Apache draait op poort 80

het gebruik van netstat-tulpn laat zien dat Apache al poort 80 gebruikt op deze machine.

ip

als het ip-adres niet werkt op uw host, moet het geïnstalleerd worden met het iproute2-pakket. Het subcommando-adres (of kortweg ip a) toont de interfaces en IP-adressen van de host van uw toepassing. U gebruikt het ip-adres om het IP-adres van uw container of host te verifiëren. Wanneer uw container bijvoorbeeld is gekoppeld aan twee netwerken, kan het ip-adres aangeven welke interface verbinding maakt met welk netwerk. Voor een eenvoudige controle, kunt u altijd het ip adres commando gebruiken om het IP adres van de host te krijgen. Het voorbeeld hieronder laat zien dat de web tier container een IP-adres van 172.17.0.2 op interface eth0 heeft.

$ 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 geeft de geopende bestanden weer die bij uw toepassing horen. Op sommige Linux machine images moet je lsof installeren met het lsof pakket. In Linux wordt bijna elke interactie met het systeem behandeld als een bestand. Als gevolg hiervan zal lsof, als uw toepassing naar een bestand schrijft of een netwerkverbinding opent, die interactie als een bestand weergeven. Net als bij netstat, kunt u lsof gebruiken om te controleren op luisterpoorten. Als u bijvoorbeeld wilt controleren of poort 80 in gebruik is, gebruikt u lsof om te controleren welk proces het gebruikt. Hieronder kun je zien dat httpd (Apache) luistert op poort 80. Je kunt ook lsof gebruiken om het proces-ID van httpd te controleren, om te onderzoeken waar het binaire bestand van de webserver zich bevindt (/usr/sbin/httpd).

voorbeeld van.png

lsof geeft de oorsprong van procesinformatie weer

Lsof laat zien dat httpd luistert op poort 80. Het onderzoeken van httpd ‘ s proces ID toont ook alle bestanden die httpd nodig heeft om te draaien.

de naam van het open bestand in de lijst met open bestanden helpt bij het lokaliseren van de oorsprong van het proces, in het bijzonder Apache.

df

u kunt DF (display free disk space) gebruiken om problemen met schijfruimte op te lossen. Wanneer u uw toepassing op een container orchestrator uitvoert, ontvangt u mogelijk een foutmelding die wijst op een gebrek aan vrije ruimte op de container host. Hoewel schijfruimte moet worden beheerd en geoptimaliseerd door een systeembeheerder, kunt u df gebruiken om de bestaande ruimte in een map te achterhalen en te bevestigen of er inderdaad geen ruimte meer is.

$ 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

de optie-h drukt de informatie af in menselijk leesbaar formaat. Standaard, zoals in het voorbeeld, levert df resultaten voor alles onder de root directory, maar je kunt ook resultaten beperken door een directory op te geven als onderdeel van je commando (zoals df-h /home).

du

om meer gedetailleerde informatie te verkrijgen over welke bestanden de schijfruimte in een map gebruiken, kunt u het commando du gebruiken. Als je bijvoorbeeld wilt weten welke log de meeste ruimte in beslag neemt in de map /var/log, kun je du gebruiken met de optie-h (leesbaar voor mensen) en de optie-s voor de totale grootte.

$ 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

het voorbeeld hierboven toont de grootste map onder / var / log naar / var/log / audit. U kunt du gebruiken in combinatie met df om te bepalen wat de schijfruimte op de host van uw toepassing gebruikt.

id

om de gebruiker te controleren die de toepassing uitvoert, gebruikt u het commando id om de identiteit van de gebruiker te retourneren. Het onderstaande voorbeeld gebruikt Vagrant om de applicatie te testen en de ontwikkelomgeving te isoleren. Nadat je inlogt op de Vagrant box, als je probeert een Apache HTTP Server (een afhankelijkheid) te installeren, stelt het systeem dat je het commando niet als root kunt uitvoeren. Om je gebruiker en groep te controleren, voer je het id commando uit en merk op dat je draait als de “vagrant” gebruiker in de “vagrant” groep.

$ 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

om dit te corrigeren, moet u het commando uitvoeren als een superuser, die verhoogde privileges biedt.

chmod

wanneer u uw programma binary voor de eerste keer op uw host uitvoert, kunt u de foutmelding “permission denied.”Zoals te zien is in het voorbeeld voor ls, kun je de permissies van je application binary controleren.

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

dit toont aan dat u geen uitvoerrechten heeft (geen “x”) om de binary uit te voeren. chmod kan de rechten corrigeren om je gebruiker in staat te stellen de binary uit te voeren.

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

zoals in het voorbeeld wordt aangetoond, worden de machtigingen bijgewerkt met uitvoerrechten. Als je nu probeert je binary uit te voeren, gooit de applicatie Geen met toestemming geweigerde fout. Chmod kan nuttig zijn wanneer u een binary in een container ook Laden. Het zorgt ervoor dat uw container de juiste rechten heeft om uw binary uit te voeren.

dig / nslookup

een DNS (domain name server) helpt bij het omzetten van een URL naar een set toepassingsservers. Het kan echter zijn dat een URL niet wordt opgelost, wat een verbindingsprobleem voor uw toepassing veroorzaakt. Bijvoorbeeld, stel dat u probeert om toegang te krijgen tot uw database op de mydatabase URL van de host van uw toepassing. In plaats daarvan, ontvangt u een” kan niet oplossen ” fout. Om problemen op te lossen, je probeert met behulp van dig (DNS lookup utility) of nslookup (query Internet name servers) om erachter te komen waarom de toepassing niet kan lijken om de database op te lossen.

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

het gebruik van nslookup laat zien dat mijn Database niet kan worden opgelost. Proberen op te lossen met dig levert hetzelfde resultaat op.

$ 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

deze fouten kunnen door veel verschillende problemen worden veroorzaakt. Als je de oorzaak niet kunt debuggen, neem dan contact op met je systeembeheerder voor meer onderzoek. Voor lokale testen kan dit probleem aangeven dat de nameservers van uw host niet correct zijn geconfigureerd. Om deze commando ‘ s te gebruiken, moet je het BIND Utility pakket installeren.

firewall-cmd

traditioneel werden firewalls op Linux geconfigureerd met het iptables commando, en hoewel het zijn alomtegenwoordigheid behoudt, is het eigenlijk grotendeels vervangen door nftables. Een vriendelijke front-end voor nftables, en degene die wordt geleverd met veel distributies standaard, is firewall-cmd. Dit commando helpt u bij het instellen van regels voor wat netwerkverkeer, zowel uitgaande als inkomende, uw computer toestaat. Deze regels kunnen worden gegroepeerd in zones, zodat u snel en gemakkelijk van de ene reeks regels naar de andere kunt verplaatsen, afhankelijk van uw vereisten.

de opdrachtsyntaxis is eenvoudig. Je gebruikt het commando en een aantal opties, die allemaal op een manier worden genoemd die je helpen bijna een voor mensen leesbare zin te construeren. Bijvoorbeeld om te zien in welke zone je je momenteel bevindt:

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

in dit voorbeeld heeft uw computer twee netwerkapparaten, en één is toegewezen aan de zone corp, terwijl de andere is toegewezen aan de zone dmz.

om te zien wat elke zone toestaat, kunt u de optie --list-all gebruiken:

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

het toevoegen van diensten is net zo eenvoudig:

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

interactie met firewall-cmd is ontworpen om intuã tief te zijn, en het heeft een uitgebreide verzameling van voorgedefinieerde diensten, plus de mogelijkheid om nft-regels direct te schrijven. Zodra u firewall-cmd gebruikt, kunt u onze firewall-cmd cheat sheet downloaden om u te helpen de belangrijkste opties te onthouden.

sestatus

je vindt meestal SELinux (een Linux security module) afgedwongen op een applicatiehost beheerd door een onderneming. SELinux biedt minst-privilege Toegang tot processen die draaien op de host, waardoor potentieel kwaadaardige processen voorkomen dat belangrijke bestanden op het systeem worden benaderd. In sommige situaties moet een toepassing toegang krijgen tot een specifiek bestand, maar kan een fout veroorzaken. Om te controleren of SELinux de toepassing blokkeert, gebruik je tail en grep om te zoeken naar een “denied” bericht in de /var/log/audit logging. Anders kun je controleren of de box SELinux ingeschakeld heeft door sestatus te gebruiken.

$ 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

de uitvoer hierboven geeft aan dat de host van de toepassing SELinux heeft ingeschakeld. Op je lokale ontwikkelomgeving, kun je SELinux updaten om meer tolerant te zijn. Als je hulp nodig hebt met een remote host, kan je systeembeheerder je helpen de beste praktijken te bepalen om je toepassing toegang te geven tot het bestand dat het nodig heeft. Als je vaak met SELinux communiceert, download dan onze SELinux cheat sheet voor een snelle referentie.

history

wanneer u zoveel commando ‘ s geeft voor testen en debuggen, kunt u de nuttige vergeten! Elke shell heeft een variant van het history Commando. Het toont de geschiedenis van commando ‘ s die je hebt uitgegeven sinds het begin van de sessie. U kunt geschiedenis gebruiken om te loggen welke commando ‘ s u hebt gebruikt om problemen met uw toepassing op te lossen. Bijvoorbeeld, wanneer u de geschiedenis uit te geven in de loop van dit artikel, Het toont de verschillende commando ‘ s die u geëxperimenteerd met en geleerd.

$ history
1 clear
2 df -h
3 du

wat als u een commando wilt uitvoeren in uw vorige geschiedenis, maar u wilt het niet opnieuw typen? Gebruik ! voor het commando nummer om opnieuw uit te voeren.

voorbeeldgeschiedenis.png

voer een opdracht in uw geschiedenis opnieuw uit

toevoegen ! voordat het commando nummer dat u wilt uitvoeren het commando opnieuw uitvoert.

basiscommando ‘ s kunnen uw expertise op het gebied van probleemoplossing verbeteren bij het bepalen waarom uw applicatie in de ene ontwikkelingsomgeving werkt, maar misschien niet in een andere. Veel systeembeheerders gebruiken deze commando ‘ s om problemen met systemen te debuggen. Het begrijpen van een aantal van deze handige opdrachten voor probleemoplossing kan u helpen met systeembeheerders te communiceren en problemen met uw toepassing op te lossen.

dit artikel is oorspronkelijk gepubliceerd in juli 2017 en is bijgewerkt door de redacteur.



+