20 Linux-komennot jokaisen sysadmin tulisi tietää

maailmassa, joka on täynnä uusia työkaluja ja monipuolisia kehitysympäristöjä, on käytännössä jokaisen kehittäjän tai insinöörin pakko oppia joitakin perus sysadmin-komentoja. Erityiset komennot ja paketit voivat auttaa kehittäjiä järjestämään, vianmääritys, ja optimoida sovelluksia ja—kun asiat menevät pieleen—tarjota arvokasta triage tietoa operaattoreille ja sysadmins.

olitpa uusi kehittäjä tai haluat hallita omaa sovellustasi, seuraavat 20 perus-sysadmin-komentoa voivat auttaa sinua ymmärtämään sovelluksiasi paremmin. Ne voivat myös auttaa sinua kuvaamaan ongelmia sysadmins-vianmääritykseen, miksi sovellus saattaa toimia paikallisesti, mutta ei etäpalvelimessa. Nämä komennot koskevat Linuxin kehitysympäristöjä, säiliöitä, virtuaalikoneita (VMS) ja paljaita metalleja.

kihara

kihara siirtää URL-osoitteen. Käytä tätä komentoa sovelluksen päätepisteen tai yhteyden testaamiseen ylävirran palvelun päätepisteeseen. curl voi olla hyödyllinen, jos sovellus voi päästä toiseen palveluun, kuten tietokantaan, tai tarkistaa, jos palvelu on terveellistä.

esimerkiksi kuvittele, että sovelluksessasi on HTTP 500-virhe, joka osoittaa, ettei se pääse MongoDB-tietokantaan.:

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

-I-valitsin näyttää otsikon tiedot ja-s-valitsin hiljentää vastauselimen. Tietokannan päätepisteen tarkistaminen paikallisesta työpöydästä:

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

mikä sitten voisi olla ongelmana? Tarkista, pääseekö sovellus tietokannan lisäksi muihin paikkoihin sovelluksen isännältä:

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

se näyttää olevan ihan ok. Yritä nyt päästä tietokantaan sovelluksen isäntä. Sovellus käyttää tietokannan isäntänimeä, joten kokeile ensin:

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

tämä osoittaa, että sovelluksesi ei voi ratkaista tietokantaa, koska tietokannan URL-osoite ei ole käytettävissä tai palvelimella (kontti tai VM) ei ole nimipalvelinta, jota se voi käyttää palvelimen nimen selvittämiseen.

python-m json.tool / jq

kun olet antanut curl, API-puhelun ulostulo voi olla vaikeasti luettavissa. Joskus, haluat pretty-tulostaa JSON ulostulo löytää tietyn merkinnän. Pythonissa on sisäänrakennettu JSON-kirjasto, joka voi auttaa tässä. Käytät python-m jsonia.työkalu sisentää ja järjestää JSON. Voit käyttää Pythonin JSON-moduulia putkittamalla JSON-tiedoston tulosteen python-m jsoniin.työkalukomento.

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

käyttääksesi Python-kirjastoa, piippaa tuloste Pythoniin-m (module) – valinnalla.

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

kehittyneempään JSON-jäsennykseen voi asentaa jq: n. jq tarjoaa joitakin vaihtoehtoja, jotka poimia tiettyjä arvoja JSON input. Pretty-print kuten Python-moduuli yllä, käytä JQ tulosteeseen.

$ 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 listaa tiedostot hakemistoon. Sysadmins ja kehittäjät antavat tämän komennon melko usein. Säiliöavaruudessa tämä komento voi auttaa määrittämään säiliökuvan hakemiston ja tiedostot. Tiedostojen etsimisen lisäksi ls voi auttaa sinua tutkimaan käyttöoikeuksiasi. Alla olevassa esimerkissä, et voi ajaa myapp koska käyttöoikeudet ongelma. Kun tarkistat käyttöoikeudet ls-l: llä, huomaat, että käyttöoikeuksilla ei ole ”x” in-rw-r–r–, jotka luetaan ja kirjoitetaan vain.

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

pyrstö

pyrstö näyttää tiedoston viimeisen osan. Vianmääritykseen ei yleensä tarvita jokaista lokiriviä. Sen sijaan haluat tarkistaa, mitä lokit kertovat viimeisimmästä pyynnöstä hakemukseesi. Tailin avulla voi esimerkiksi tarkistaa, mitä lokissa tapahtuu, kun tekee pyynnön Apache HTTP-palvelimelle.

esimerkki.png

käytä tail-f: ää Apache HTTP-palvelimen lokien seuraamiseen ja näe pyynnöt sellaisina kuin ne tapahtuvat.

käytä tail-f: ää seurataksesi Apache HTTP-lokeja ja nähdäksesi pyynnöt niiden tapahtuessa.

valitsin-f ilmaisee” seuraa ” – vaihtoehdon, joka tulostaa lokirivit sitä mukaa kuin ne kirjoitetaan tiedostoon. Esimerkissä on tausta-skripti, joka käyttää päätepistettä muutaman sekunnin välein ja loki tallentaa pyynnön. Sen sijaan, että seuraisit lokia reaaliajassa, Voit myös käyttää tailiä nähdäksesi tiedoston viimeiset 100 riviä-n-valinnalla.

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

cat

cat yhdistää ja tulostaa tiedostoja. Saatat antaa cat tarkistaa sisällön riippuvuudet tiedoston tai vahvistaa version sovelluksen, joka on jo rakennettu paikallisesti.

$ cat requirements.txt
flask
flask_pymongo

yllä olevassa esimerkissä tarkistetaan, onko Python-Pullosovelluksessasi riippuvuussuhde.

grep

grep etsii tiedostokuvioita. Jos etsit tiettyä kaavaa toisen komennon ulostulossa, grep korostaa asiaankuuluvia rivejä. Käytä tätä komentoa lokitiedostojen, tiettyjen prosessien ja muiden etsimiseen. Jos haluat nähdä, käynnistyykö Apache Tomcat, saatat häkeltyä rivien määrästä. Johtamalla tuloste grep-komentoon, eristät palvelimen käynnistymistä osoittavat rivit.

$ 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-komento, joka on osa procps-ng-pakettia, joka tarjoaa hyödyllisiä komentoja prosessitunnusten tutkimiseen, näyttää käynnissä olevan prosessin tilan. Käytä tätä komentoa käynnissä olevan sovelluksen määrittämiseen tai odotetun Prosessin vahvistamiseen. Jos haluat esimerkiksi tarkistaa käynnissä olevan Tomcat-WWW-palvelimen, käytät ps: ää ja sen vaihtoehtoja saadaksesi Tomcat-prosessin tunnuksen.

$ 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

vielä enemmän luettavuutta, käytä ps ja putki grep.

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

env

env mahdollistaa ympäristömuuttujien asettamisen tai tulostamisen. Vianmäärityksen aikana voi olla hyödyllistä tarkistaa, estääkö väärä ympäristömuuttuja sovelluksen käynnistämisen. Alla olevassa esimerkissä tätä komentoa käytetään sovelluksen palvelimelle asetettujen ympäristömuuttujien tarkistamiseen.

$ 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

huomaa, että sovellus käyttää Pythonia ja sillä on ympäristömuuttujia yhdistettäessä MongoDB-tietokantaan.

top

top näyttää ja päivittää lajiteltuja prosessitietoja. Tämän seurantatyökalun avulla voit määrittää, mitkä prosessit ovat käynnissä ja kuinka paljon muistia ja suoritinta ne kuluttavat. Yleinen tapaus ilmenee, kun suoritat sovelluksen ja se kuolee minuuttia myöhemmin. Ensin tarkistetaan sovelluksen palautusvirhe, joka on muistivirhe.

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

onko hakemuksesi todella poissa muistista? Vahvista, käytä top määrittää, kuinka paljon CPU ja muistia sovellus kuluttaa. Kun annat top, huomaat Python-sovelluksen käyttävän suurinta osaa suorittimesta, ja sen muistinkäyttö on nousussa, ja epäilet sen olevan sovelluksesi. Kun se toimii, osut” C ” avain nähdä koko komento ja reverse-insinööri, jos prosessi on hakemuksesi. Se osoittautuu muistipainotteiseksi sovellukseksesi (memeater.py). kun sovellus on loppunut muisti, järjestelmä tappaa sen out-of-memory (oom) virhe.

esimerkki.png

antaa alkuun sovelluksen, joka kuluttaa kaiken sen muistin.

sovelluksen muistin ja suorittimen käyttö lisääntyy, ja lopulta se kuolee.

esimerkki tästä.png

 painamalla C yläosaa näytetään koko komento

painamalla” C ” – näppäintä näet koko komennon, joka käynnisti sovelluksen.

oman sovelluksen tarkistamisen lisäksi voit käyttää Topia muiden suoritinta tai muistia hyödyntävien prosessien debugaamiseen.

netstat

netstat näyttää verkon tilan. Tämä komento näyttää käytössä olevat verkkoportit ja niiden saapuvat yhteydet. Netstat ei kuitenkaan tule ulos-of-the-box Linuxissa. Jos haluat asentaa sen, löydät sen net-tools-paketista. Koska kehittäjä, joka kokeilee paikallisesti tai työntää sovelluksen isäntä, saatat saada virhe, että portti on jo varattu tai osoite on jo käytössä. Netstatin käyttäminen protokollan, prosessin ja porttivaihtoehtojen kanssa osoittaa, että Apache HTTP-palvelin käyttää jo porttia 80 alla olevassa isännässä.

esimerkki: netstat.png

 netstat tarkistaa, että Apache on käynnissä portilla 80

netstat-tulpn käyttäminen osoittaa, että Apache käyttää jo porttia 80 tässä koneessa.

ip

Jos ip-osoite ei toimi isännällä, se on asennettava iproute2-paketin mukana. Alakomennusosoite (tai lyhyesti ip a) näyttää sovelluksen isännän rajapinnat ja IP-osoitteet. Käytät ip-osoitetta säiliön tai isännän IP-osoitteen vahvistamiseen. Kun kontti on esimerkiksi liitetty kahteen verkkoon, ip-osoite voi näyttää, mikä käyttöliittymä yhdistää mihinkin verkkoon. Yksinkertainen tarkistus, voit aina käyttää ip-osoite komento saada IP-osoite isäntä. Alla oleva esimerkki osoittaa, että web-tason säiliön IP-osoite on 172.17.0.2 käyttöliittymässä 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 listaa hakemukseen liittyvät avoimet tiedostot. Joihinkin Linux-koneen kuviin lsof on asennettava lsof-paketilla. Linuxissa lähes kaikki vuorovaikutus järjestelmän kanssa käsitellään tiedostona. Tämän seurauksena, jos sovellus kirjoittaa tiedostoon tai avaa verkkoyhteyden, lsof heijastaa tämän vuorovaikutuksen tiedostona. Kuten netstat, voit käyttää lsof tarkistaa kuunteluportit. Jos haluat esimerkiksi tarkistaa, onko portti 80 käytössä, voit tarkistaa lsof: n avulla, mikä prosessi käyttää sitä. Alla, näet, että httpd (Apache) kuuntelee portti 80. Voit myös käyttää lsof: ia tarkistaaksesi httpd: n PROSESSITUNNUKSEN ja tutkiaksesi, missä WWW-palvelimen binääri sijaitsee (/usr/sbin/httpd).

esimerkki.png

lsof paljastaa Prosessitietojen alkuperän

Lsof näyttää, että httpd kuuntelee porttia 80. Httpd: n prosessitunnuksen tutkiminen näyttää myös kaikki tiedostot, joita httpd tarvitsee toimiakseen.

avoimen tiedoston nimi avointen tiedostojen luettelossa auttaa määrittämään prosessin alkuperän, erityisesti Apache.

df

voit käyttää DF: ää (display free disk space) levytilan ongelmien vianmääritykseen. Kun suoritat sovelluksen kontti orkestraattori, saatat saada virheilmoituksen signalointi puute vapaata tilaa kontti isäntä. Vaikka levytilaa pitäisi hallita ja optimoida sysadmin, voit käyttää df selvittää nykyisen tilan hakemistossa ja vahvistaa, Jos olet todellakin pois tilaa.

$ 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

– h-valinta tulostaa tiedot ihmisen luettavassa muodossa. Oletuksena, kuten esimerkissä, df tarjoaa tulokset kaikesta juurihakemiston alla, mutta voit myös rajoittaa tuloksia antamalla hakemiston osana komentoa (kuten df-h /home).

du

saadaksesi tarkempia tietoja siitä, mitkä tiedostot käyttävät hakemiston levytilaa, voit käyttää du-komentoa. Jos haluat selvittää, mikä loki vie eniten tilaa esimerkiksi / var / lokihakemistossa, voit käyttää du-h (ihmisluettava)-valitsinta ja-s-valitsinta kokonaiskokoa varten.

$ 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

yllä olevassa esimerkissä suurin Hakemisto / var / log on / var/log / audit. Voit käyttää du yhdessä df määrittää, mitä hyödyntää levytilaa sovelluksen isäntä.

id

voit tarkistaa sovellusta käyttävän käyttäjän palauttamalla käyttäjän henkilöllisyyden id-komennolla. Oheinen esimerkki käyttää vagrantia sovelluksen testaamiseen ja sen kehitysympäristön eristämiseen. Kun olet kirjautunut Kulkurin ruutuun, jos yrität asentaa Apache HTTP Server (riippuvuus) järjestelmä toteaa, että et voi suorittaa komentoa root. Voit tarkistaa käyttäjän ja ryhmän antamalla id-komennon ja huomata, että olet ”vagrant” – käyttäjänä ”vagrant” – ryhmässä.

$ 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

korjataksesi tämän, sinun on suoritettava komento pääkäyttäjänä, joka tarjoaa korotetut oikeudet.

chmod

kun suoritat sovelluksesi binäärin ensimmäistä kertaa palvelimessasi, saatat saada virheviestin ” lupa evätty.”Kuten esimerkissä LS, voit tarkistaa käyttöoikeudet sovelluksen binary.

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

tämä osoittaa, että sinulla ei ole suoritusoikeuksia (Ei ”x”) binäärin ajamiseen. chmod voi korjata käyttöoikeuksia, jotta käyttäjä voi suorittaa binäärin.

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

kuten esimerkistä käy ilmi, tämä päivittää käyttöoikeudet suoritusoikeuksilla. Nyt kun yrität suorittaa binary, sovellus ei heittää lupaa evätty virhe. Chmod voi olla hyödyllinen, kun lataat binäärin myös säiliöön. Se varmistaa, että säiliö on oikeat oikeudet suorittaa binary.

dig / nslookup

domain name server (DNS) auttaa ratkaisemaan URL-osoitteen joukko sovelluspalvelimia. Saatat kuitenkin huomata, että URL-osoite ei ratkaise, mikä aiheuttaa sovelluksellesi yhteysongelman. Esimerkiksi, jos yrität käyttää tietokantaasi mydatabase URL sovelluksen isäntä. Sen sijaan, saat” ei voi ratkaista ” virhe. Vianmääritys, yrität käyttää dig (DNS lookup apuohjelma) tai nslookup (kysely Internet name palvelimet) selvittää, miksi sovellus ei näytä ratkaista tietokantaan.

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

Nslookupin käyttö osoittaa, ettei mydatabaasia voi ratkaista. Yrittää ratkaista dig tuottaa saman tuloksen.

$ 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

nämä virheet voivat johtua monista eri asioista. Jos et voi debug perussyy, ota yhteyttä sysadmin lisätietoja. Paikallinen testaus, tämä ongelma voi osoittaa, että isäntäsi nimipalvelimia ei ole määritetty asianmukaisesti. Voit käyttää näitä komentoja asentamalla BIND Utilities-paketin.

firewall-cmd

perinteisesti palomuurit on konfiguroitu Linuxissa iptables-komennolla, ja vaikka se säilyttää ubikviteettinsä, se on itse asiassa suurelta osin korvattu nftables-komennolla. Ystävällinen etupää nftables, ja yksi, joka alukset monet jakelut oletuksena, on palomuuri-cmd. Tämän komennon avulla voit määrittää säännöt siitä, mitä verkkoliikennettä, sekä lähtevää että saapuvaa, tietokoneesi sallii. Nämä säännöt voidaan ryhmitellä vyöhykkeisiin, joten voit nopeasti ja helposti siirtyä yhdestä sääntökokonaisuudesta toiseen, riippuen tarpeistasi.

komentosyntaksi on suoraviivainen. Käytät komentoa ja joitakin vaihtoehtoja, jotka kaikki on nimetty tavoilla, jotka auttavat sinua melkein rakentamaan ihmisen luettavan lauseen. Esimerkiksi, nähdä, millä alueella olet tällä hetkellä:

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

tässä esimerkissä tietokoneessa on kaksi verkkolaitetta, joista toinen on määrätty corp – vyöhykkeelle ja toinen dmz – vyöhykkeelle.

nähdäksesi, mitä kukin vyöhyke sallii, voit käyttää --list-all – vaihtoehtoa:

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

palveluiden lisääminen on yhtä helppoa:

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

vuorovaikutus palomuurin kanssa-cmd on suunniteltu intuitiiviseksi, ja sillä on laaja kokoelma ennalta määritettyjä palveluja sekä kyky kirjoittaa NFT: n sääntöjä suoraan. Kun aloitat palomuuri-cmd, voit ladata palomuuri-cmd lunttilappu auttaa sinua muistamaan sen tärkeimmät vaihtoehdot.

sestatus

yleensä löydät SELinuxin (Linux-tietoturvamoduuli), joka on pantu täytäntöön yrityksen hallinnoimassa sovelluksen isännässä. SELinux tarjoaa vähiten käyttöoikeuksia palvelimessa käynnissä oleviin prosesseihin estäen mahdollisesti haitallisia prosesseja pääsemästä järjestelmän tärkeisiin tiedostoihin. Joissakin tilanteissa sovelluksen on päästävä tiettyyn tiedostoon, mutta se voi aiheuttaa virheen. Jos haluat tarkistaa, estääkö SELinux sovelluksen, etsi tail-ja grep-komennoilla ”evätty” viesti /var/log/audit-kirjauksesta. Muussa tapauksessa voit tarkistaa, onko ruudussa SELinux käytössä sestatuksen avulla.

$ 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

yllä oleva tuloste osoittaa, että sovelluksen isännällä on SELinux käytössä. Omassa kehitysympäristössäsi voit päivittää SELinuxin sallivammaksi. Jos tarvitset apua etäpalvelimen kanssa, sysadmin voi auttaa sinua määrittämään parhaat käytännöt, joiden avulla sovellus voi käyttää tarvitsemaansa tiedostoa. Jos olet vuorovaikutuksessa SELinuxin kanssa usein, lataa SELinux lunttilappumme nopeaa käyttöä varten.

historia

kun annat niin monta koetta ja virheenkorjausta varten, saatat unohtaa hyödylliset komennot! Jokaisella komentotulkilla on historiakomento. Se näyttää komentojen historian, jotka olet antanut istunnon alusta lähtien. Voit kirjata historian avulla, mitä komentoja käytit sovelluksen vianmääritykseen. Kun esimerkiksi julkaiset historiaa tämän kirjoituksen aikana, se näyttää eri käskyt, joita olet kokeillut ja oppinut.

$ history
1 clear
2 df -h
3 du

mitä jos haluat suorittaa komennon aiemmassa historiassasi, mutta et halua kirjoittaa sitä uudelleen? Käytä ! ennen uudelleen suoritettavaa komentonumeroa.

esimerkki historiasta.png

suorita komento uudelleen historiassasi

lisätään ! ennen komentonumeroa, jonka haluat suorittaa, komento uudelleen.

peruskomennot voivat parantaa vianmääritysosaamistasi, kun määrität, miksi sovellus toimii yhdessä kehitysympäristössä, mutta ei ehkä toisessa. Monet sysadmins hyödyntää näitä komentoja debug ongelmia järjestelmien. Joidenkin näistä hyödyllisistä vianmäärityskomennoista ymmärtäminen voi auttaa sinua kommunikoimaan sysadminsin kanssa ja ratkaisemaan ongelmia sovelluksen kanssa.

tämä juttu on julkaistu alun perin heinäkuussa 2017 ja päätoimittaja on päivittänyt sen.



+