i en värld som spricker med nya verktyg och olika utvecklingsmiljöer är det praktiskt taget en nödvändighet för alla utvecklare eller ingenjörer att lära sig några grundläggande sysadminkommandon. Specifika kommandon och paket kan hjälpa utvecklare att organisera, felsöka och optimera sina applikationer och—när saker går fel—ge värdefull triageinformation till operatörer och systemadministratörer.
oavsett om du är en ny utvecklare eller vill hantera din egen applikation kan följande 20 grundläggande sysadminkommandon hjälpa dig att bättre förstå dina applikationer. De kan också hjälpa dig att beskriva problem för systemadministratörer felsökning varför ett program kan fungera lokalt men inte på en fjärrvärd. Dessa kommandon gäller för Linux – utvecklingsmiljöer, Behållare, virtuella maskiner (VM) och bare metal.
curl
curl överför en URL. Använd det här kommandot för att testa en applikations slutpunkt eller anslutning till en uppströms tjänsteslutpunkt. curl kan vara användbart för att avgöra om din ansökan kan nå en annan tjänst, till exempel en databas, eller kontrollera om din tjänst är frisk.
Tänk dig att din ansökan kastar ett HTTP 500-fel som indikerar att det inte kan nå en MongoDB-databas:
$ curl -I -s myapplication:5000
HTTP/1.0 500 INTERNAL SERVER ERROR
alternativet-i visar rubrikinformationen och alternativet-s tystar svarskroppen. Kontrollera slutpunkten för din databas från ditt lokala skrivbord:
$ curl -I -s database:27017
HTTP/1.0 200 OK
så vad kan vara problemet? Kontrollera om din ansökan kan komma till andra platser förutom databasen från programvärden:
$ curl -I -s https://opensource.com
HTTP/1.1 200 OK
det verkar vara okej. Försök nu nå databasen från programvärden. Din ansökan använder databasens värdnamn, så försök det först:
$ curl database:27017
curl: (6) Couldn't resolve host 'database'
detta indikerar att programmet inte kan lösa databasen eftersom webbadressen till databasen inte är tillgänglig eller värden (behållare eller VM) inte har en namnserver som den kan använda för att lösa värdnamnet.
python-m json.verktyg / jq
när du har utfärdat curl kan utmatningen från API-anropet vara svår att läsa. Ibland vill du skriva ut JSON-utgången för att hitta en specifik post. Python har ett inbyggt JSON-bibliotek som kan hjälpa till med detta. Du använder python-m json.verktyg för att dra in och organisera JSON. För att använda Pythons JSON-modul, rör utmatningen från en JSON-fil till python-m json.verktyg kommando.
$ cat test.json
{"title":"Person","type":"object","properties":{"firstName":{"type":"string"},"lastName":{"type":"string"},"age":{"description":"Age in years","type":"integer","minimum":0}},"required":}
för att använda Python-biblioteket, rör utmatningen till Python med alternativet-m (modul).
$ 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"
}
för mer avancerad JSON-tolkning kan du installera jq. jq ger några alternativ som extraherar specifika värden från JSON-ingången. För att pretty-print som Python modulen ovan, helt enkelt tillämpa jq till utgången.
$ 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 listar filer i en katalog. Sysadmins och utvecklare utfärdar detta kommando ganska ofta. I behållarutrymmet kan det här kommandot hjälpa till att bestämma din behållarbilds katalog och filer. Förutom att leta upp dina filer kan ls hjälpa dig att undersöka dina behörigheter. I exemplet nedan kan du inte köra myapp på grund av ett behörighetsproblem. När du kontrollerar behörigheterna med ls-l inser du att behörigheterna inte har ett ”x” in-rw-r–r–, som bara läses och skrivs.
$ ./myapp
bash: ./myapp: Permission denied
$ ls -l myapp
-rw-r--r--. 1 root root 33 Jul 21 18:36 myapp
svans
svans visar den sista delen av en fil. Du behöver vanligtvis inte varje loggrad för att felsöka. Istället vill du kontrollera vad dina loggar säger om den senaste begäran till din ansökan. Du kan till exempel använda tail för att kontrollera vad som händer i loggarna när du gör en begäran till din Apache HTTP-server.
example_tail.png
använd tail-f för att följa Apache HTTP-loggar och se förfrågningarna när de händer.
alternativet-f anger alternativet ”Följ”, som matar ut loggraderna när de skrivs till filen. Exemplet har ett bakgrundsskript som öppnar slutpunkten med några sekunder och loggen registrerar begäran. Istället för att följa loggen i realtid kan du också använda tail för att se de sista 100 raderna i filen med alternativet-n.
$ tail -n 100 /var/log/httpd/access_log
katt
katt sammanfogar och skriver ut filer. Du kan utfärda cat för att kontrollera innehållet i filen beroenden eller för att bekräfta den version av programmet som du redan har byggt lokalt.
$ cat requirements.txt
flask
flask_pymongo
exemplet ovan kontrollerar om din Python Flask-applikation har Flask listad som ett beroende.
grep
grep söker filmönster. Om du letar efter ett specifikt mönster i utmatningen från ett annat kommando markerar grep de relevanta raderna. Använd det här kommandot för att söka loggfiler, specifika processer och mer. Om du vill se om Apache Tomcat startar kan du bli överväldigad av antalet rader. Genom att pipa den utmatningen till grep-kommandot isolerar du raderna som indikerar Serverstart.
$ 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
ps-kommandot, en del av procps-ng-paketet som ger användbara kommandon för att undersöka process-ID, visar status för en pågående process. Använd det här kommandot för att bestämma ett program som körs eller bekräfta en förväntad process. Om du till exempel vill söka efter en Tomcat-webbserver som körs använder du ps med dess alternativ för att få process-ID för 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
för ännu mer läsbarhet, använd ps och rör den till grep.
$ ps -ef | grep tomcat
root 1 0 1 18:55 ? 00:00:02 /docker-java-home/jre/bi
env
env låter dig ställa in eller skriva ut miljövariablerna. Under felsökning kan det vara användbart för att kontrollera om fel miljövariabel hindrar din applikation från att starta. I exemplet nedan används det här kommandot för att kontrollera miljövariablerna som ställts in på programmets värd.
$ 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
Lägg märke till att applikationen använder Python och har miljövariabler för att ansluta till en MongoDB-databas.
topp
topp visar och uppdaterar sorterade processinformation. Använd detta övervakningsverktyg för att avgöra vilka processer som körs och hur mycket minne och CPU de förbrukar. Ett vanligt fall uppstår när du kör ett program och det dör en minut senare. Först kontrollerar du programmets returfel, vilket är ett minnesfel.
$ tail myapp.log
Traceback (most recent call last):
MemoryError
är din ansökan verkligen ur minnet? För att bekräfta, använd top för att bestämma hur mycket CPU och minne din applikation förbrukar. När du utfärdar top märker du en Python-applikation som använder det mesta av CPU, med dess minnesanvändning klättring, och misstänker att det är din ansökan. Medan den körs trycker du på” C ” -tangenten för att se hela kommandot och reverse-engineer om processen är din ansökan. Det visar sig vara din minnesintensiva applikation (memeater.py). när din ansökan har slut på minne, dödar systemet den med en out-of-memory (OOM) fel.
example_top.PNG
applikationens minne och CPU-användning ökar, så småningom dödas.
example_topwithc.png
genom att trycka på ”C” – tangenten kan du se hela kommandot som startade programmet.
förutom att kontrollera din egen applikation kan du använda top för att felsöka andra processer som använder CPU eller minne.
netstat
netstat visar nätverksstatus. Detta kommando visar nätverksportar som används och deras inkommande anslutningar. Netstat kommer dock inte out-of-the-box på Linux. Om du behöver installera det kan du hitta det i net-tools-paketet. Som utvecklare som experimenterar lokalt eller driver ett program till en värd kan du få ett felmeddelande om att en port redan är tilldelad eller att en adress redan används. Använda netstat med protokoll, process och portalternativ visar att Apache HTTP-server redan använder port 80 på nedanstående värd.
example_netstat.PNG
användning av netstat-tulpn visar att Apache redan använder port 80 på den här maskinen.
ip
om ip-adressen inte fungerar på din värd måste den installeras med iproute2-paketet. Underkommandoadressen (eller bara ip A för kort) visar gränssnitt och IP-adresser för din applikations värd. Du använder ip-adress för att verifiera din container eller värdens IP-adress. När din behållare till exempel är ansluten till två nätverk kan ip-adressen visa vilket gränssnitt som ansluter till vilket nätverk. För en enkel kontroll kan du alltid använda kommandot ip-adress för att få värdens IP-adress. Exemplet nedan visar att Webb tier behållaren har en IP-adress 172.17.0.2 på gränssnittet 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 listar de öppna filer som är associerade med din applikation. På vissa Linux-maskinbilder måste du installera lsof med lsof-paketet. I Linux behandlas nästan alla interaktioner med systemet som en fil. Som ett resultat, om din applikation skriver till en fil eller öppnar en nätverksanslutning, kommer lsof att återspegla den interaktionen som en fil. I likhet med netstat kan du använda lsof för att söka efter lyssningsportar. Om du till exempel vill kontrollera om port 80 används använder du lsof för att kontrollera vilken process som använder den. Nedan kan du se att httpd (Apache) lyssnar på port 80. Du kan också använda lsof för att kontrollera process-ID för httpd och undersöka var webbserverns binära finns (/usr/sbin/httpd).
example_lsof.png
Lsof visar att httpd lyssnar på port 80. Att undersöka httpds process-ID visar också alla filer som httpd behöver för att kunna köras.
namnet på den öppna filen i listan över öppna filer hjälper till att hitta processens ursprung, särskilt Apache.
df
du kan använda DF (visa ledigt diskutrymme) för att felsöka problem med diskutrymme. När du kör programmet på en container orchestrator kan du få ett felmeddelande som signalerar brist på ledigt utrymme på containervärden. Medan diskutrymme ska hanteras och optimeras av en sysadmin kan du använda df för att räkna ut det befintliga utrymmet i en katalog och bekräfta om du verkligen är ute av rymden.
$ 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
alternativet-h skriver ut informationen i läsbart format. Som standard, som i exemplet, ger df resultat för allt under rotkatalogen, men du kan också begränsa resultaten genom att tillhandahålla en katalog som en del av ditt kommando (till exempel df-h /home).
du
för att hämta mer detaljerad information om vilka filer som använder diskutrymmet i en katalog kan du använda kommandot du. Om du vill ta reda på vilken logg som tar mest plats i katalogen /var/log kan du till exempel använda du med alternativet-h (human-readable) och alternativet-S för den totala storleken.
$ 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
exemplet ovan visar den största katalogen under /var/log att vara /var/log/audit. Du kan använda du tillsammans med df för att avgöra vad som utnyttjar diskutrymmet på programmets värd.
id
för att kontrollera användaren som kör programmet, använd kommandot id för att returnera användaridentiteten. Exemplet nedan använder Vagrant för att testa applikationen och isolera dess utvecklingsmiljö. När du har loggat in i Vagrant-rutan, om du försöker installera Apache HTTP-Server (ett beroende) anger systemet att du inte kan utföra kommandot som root. För att kontrollera din användare och grupp, utfärda id-kommandot och märka att du kör som ”vagrant” – användare i gruppen ”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
för att korrigera detta måste du köra kommandot som en superanvändare, vilket ger förhöjda behörigheter.
chmod
när du kör din ansökan binär för första gången på din värd, kan du få felmeddelandet ”tillstånd nekas.”Som framgår av exemplet för ls kan du kontrollera behörigheterna för din ansökan binär.
$ ls -l
total 4
-rw-rw-r--. 1 vagrant vagrant 34 Jul 11 02:17 test.sh
detta visar att du inte har exekveringsrättigheter (inget ”x”) för att köra binären. chmod kan korrigera behörigheterna så att din användare kan köra binären.
$ chmod +x test.sh
$ ls -l
total 4
-rwxrwxr-x. 1 vagrant vagrant 34 Jul 11 02:17 test.sh
som visas i exemplet uppdaterar detta behörigheterna med exekveringsrättigheter. Nu när du försöker köra din binära, kastar programmet inte ett tillstånd-nekat fel. Chmod kan vara användbart när du laddar en binär i en behållare också. Det säkerställer att din behållare har rätt behörighet att köra din binära.
dig / nslookup
en domännamnsserver (DNS) hjälper till att lösa en URL till en uppsättning programservrar. Det kan dock hända att en URL inte löser sig, vilket orsakar ett anslutningsproblem för din applikation. Säg till exempel att du försöker komma åt din databas på mydatabase-webbadressen från programmets värd. Istället får du ett” Kan inte lösa ” – fel. För att felsöka försöker du använda dig (DNS lookup utility) eller nslookup (query Internet name servers) för att ta reda på varför programmet inte verkar lösa databasen.
$ nslookup mydatabase
Server: 10.0.2.3
Address: 10.0.2.3#53
** server can't find mydatabase: NXDOMAIN
använda nslookup visar att mydatabase inte kan lösas. Att försöka lösa med dig ger samma resultat.
$ 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
dessa fel kan orsakas av många olika problem. Om du inte kan felsöka grundorsaken, kontakta din sysadmin för mer utredning. För lokal testning kan det här problemet indikera att värdens namnservrar inte är konfigurerade på rätt sätt. För att använda dessa kommandon måste du installera BIND Utilities-paketet.
brandvägg-cmd
traditionellt konfigurerades brandväggar på Linux med iptables-kommandot, och medan det behåller sin ubiquity har det faktiskt till stor del ersatts av nftables. En vänlig front-end för nftables, och den som levereras med många distributioner som standard, är firewall-cmd. Det här kommandot hjälper dig att ställa in regler för vilken nätverkstrafik, både utgående och inkommande, din dator tillåter. Dessa regler kan grupperas i zoner, så att du snabbt och enkelt kan flytta från en uppsättning regler till en annan, beroende på dina krav.
kommandosyntaxen är enkel. Du använder kommandot och ett antal alternativ, som alla heter på sätt som hjälper dig att nästan konstruera en läsbar mening. Till exempel, för att se vilken zon du befinner dig i:
$ sudo firewall-cmd --get-active-zones``
corp
interfaces: ens0
dmz
interfaces: ens1
i det här exemplet har din dator två nätverksenheter, och en tilldelas zonen corp
, medan den andra tilldelas zonen dmz
.
för att se vad varje zon tillåter kan du använda alternativet --list-all
:
$ sudo firewall-cmd --zone corp --list-all
corp
target: default
interfaces: ens0
services: cockpit dhcpv6-client ssh
ports:
protocols:
att lägga till tjänster är lika enkelt:
$ sudo firewall-cmd --add-service http --permanent
$ sudo firewall-cmd --reload
interagera med brandvägg-cmd är utformad för att vara intuitiv, och den har en omfattande samling av predifined tjänster, plus möjligheten att skriva NFT regler direkt. När du börjar använda firewall-cmd kan du ladda ner vårt firewall-cmd-fuskark för att hjälpa dig att komma ihåg de viktigaste alternativen.
sestatus
du hittar vanligtvis SELinux (en Linux-säkerhetsmodul) som tillämpas på en programvärd som hanteras av ett företag. SELinux ger minst behörighet till processer som körs på värden, vilket förhindrar potentiellt skadliga processer från att komma åt viktiga filer på systemet. I vissa situationer måste en applikation komma åt en specifik fil men kan kasta ett fel. För att kontrollera om SELinux blockerar programmet, använd tail och grep för att leta efter ett ”nekat” – meddelande i /var/log/audit loggning. Annars kan du kontrollera om rutan har SELinux aktiverat med 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
utmatningen ovan indikerar att programmets värd har SELinux aktiverat. På din lokala utvecklingsmiljö kan du uppdatera SELinux för att vara mer tillåtande. Om du behöver hjälp med en fjärrvärd kan din sysadmin hjälpa dig att bestämma bästa praxis för att låta din applikation komma åt filen den behöver. Om du interagerar med SELinux ofta, ladda ner vårt SELinux-fuskblad för snabb referens.
Historik
när du utfärdar så många kommandon för testning och felsökning kan du glömma de användbara! Varje skal har en variant av kommandot historia. Det visar historien om kommandon som du har utfärdat sedan sessionens början. Du kan använda historiken för att logga vilka kommandon du använde för att felsöka din applikation. När du till exempel utfärdar Historik under den här artikeln visar den de olika kommandona du experimenterade med och lärde dig.
$ history
1 clear
2 df -h
3 du
vad händer om du vill köra ett kommando i din tidigare historia, men du vill inte skriva om det? Användning ! innan kommandonumret ska köras igen.
example_history.png
lägga till ! innan kommandonumret du vill utföra utfärdar kommandot igen.
grundläggande kommandon kan förbättra din felsökningsexpertis när du bestämmer varför din applikation fungerar i en utvecklingsmiljö men kanske inte i en annan. Många sysadmins utnyttjar dessa kommandon för att felsöka problem med system. Att förstå några av dessa användbara felsökningskommandon kan hjälpa dig att kommunicera med systemadministratörer och lösa problem med din applikation.
denna artikel publicerades ursprungligen i juli 2017 och har uppdaterats av redaktören.