Darba, waqt intervista, ġejt mistoqsi, x'se tagħmel jekk issib servizz li ma jaħdimx minħabba l-fatt li d-diska spiċċat bla spazju?
Ovvjament weġibt li se nara x’inhu okkupat minn dan il-post u, jekk jista’ jkun, inaddaf il-post.
Imbagħad l-intervistatur staqsa, x'jiġri jekk ma jkunx hemm spazju ħieles fuq il-partizzjoni, iżda wkoll ma tara l-ebda fajl li jieħu l-ispazju kollu?
Għal dan għidt li inti tista 'dejjem tħares lejn deskritturi tal-fajls miftuħa, pereżempju bil-kmand lsof, u tifhem liema applikazzjoni ħadet l-ispazju kollu disponibbli, u mbagħad tista' taġixxi skont iċ-ċirkostanzi, skont jekk id-data hijiex meħtieġa .
L-intervistatur interrompetni fl-aħħar kelma, u żied mal-mistoqsija tiegħu: "Ejja ngħidu li m'għandniex bżonn id-data, huwa biss log tad-debug, iżda l-applikazzjoni ma taħdimx għax ma tistax tikteb debug"?
"Tajjeb," weġibt, "nistgħu nitfi d-debug fil-konfigurazzjoni tal-applikazzjoni u nibdewha."
L-intervistatur oġġezzjona: "Le, ma nistgħux nibdew mill-ġdid l-applikazzjoni, għad għandna dejta importanti maħżuna fil-memorja, u klijenti importanti huma konnessi mas-servizz innifsu, li ma nistgħux inġiegħlu nerġgħu nqabbdu mill-ġdid."
“okay,” għedt, “jekk ma nistgħux nibdew mill-ġdid l-applikazzjoni u d-dejta mhix importanti għalina, allura nistgħu sempliċement inaddfu dan il-fajl miftuħ permezz tad-deskrittur tal-fajl, anki jekk ma narawhiex fil-kmand ls fuq is-sistema tal-fajls.”
L-intervistatur kien kuntent, imma jien ma kontx.
Imbagħad ħsibt, għaliex il-persuna li tittestja l-għarfien tiegħi ma tħafferx aktar fil-fond? Imma x'jiġri jekk id-data hija importanti wara kollox? X'jiġri jekk ma nistgħux nibdew proċess, u l-proċess jikteb fis-sistema tal-fajls fuq partizzjoni li m'għandha l-ebda spazju ħieles? X'jiġri jekk ma nistgħux nitilfu mhux biss id-dejta li diġà nkitbet, iżda wkoll id-dejta li dan il-proċess jikteb jew jipprova jikteb?
Tuzik
Kmieni fil-karriera tiegħi, ippruvajt noħloq applikazzjoni żgħira li kellha bżonn taħżen l-informazzjoni tal-utent. U mbagħad ħsibt, kif nista 'nqabbel lill-utent mad-data tiegħu. Per eżempju, għandi Ivanov Ivan Ivanovich, u għandu xi informazzjoni, imma kif nista 'nagħmel ħbieb magħhom? Nista 'nindika direttament li l-kelb jismu "Tuzik" jappartjeni lil dan Ivan stess. Imma x'jiġri jekk jibdel ismu u minflok Ivan isir, pereżempju, Olya? Imbagħad jirriżulta li Olya Ivanovna Ivanova tagħna ma jibqax ikollha kelb, u Tuzik tagħna xorta se jappartjeni għall-Ivan ineżistenti. Database li tat lil kull utent identifikatur uniku (ID) għenet biex issolvi din il-problema, u Tuzik tiegħi kien marbut ma 'din l-ID, li, fil-fatt, kien biss numru tas-serje. Għalhekk, is-sid tal-ass kellu n-numru tal-ID 2, u f'xi ħin Ivan kien taħt din l-ID, u mbagħad Olya saret taħt l-istess ID. Il-problema tal-umanità u t-trobbija tal-annimali kienet prattikament solvuta.
Deskrittur tal-fajl
Il-problema tal-fajl u l-programm li jaħdem ma 'dan il-fajl hija bejn wieħed u ieħor l-istess bħal dik tal-kelb u l-bniedem tagħna. Ejja ngħidu li ftaħt fajl imsejjaħ ivan.txt u bdejt nikteb il-kelma tuzik fih, iżda rnexxieli nikteb biss l-ewwel ittra "t" fil-fajl, u dan il-fajl ingħata isem ġdid minn xi ħadd, pereżempju, għal olya.txt. Imma l-fajl jibqa 'l-istess, u xorta rrid nirreġistra l-ass tiegħi fiha. Kull darba li fajl jinfetaħ b'sejħa tas-sistema
Fil-Linux, il-librerija libc tiftaħ fajls deskritturi 3 għal kull applikazzjoni (proċess) li qed taħdem, numerati 0,1,2. Aktar informazzjoni tinsab fuq il-links
- Id-deskrittur tal-fajl 0 jissejjaħ STDIN u huwa assoċjat mal-input tal-applikazzjoni
- Id-deskrittur tal-fajl 1 jissejjaħ STDOUT u jintuża minn applikazzjonijiet biex joħroġ dejta, bħal kmandi tal-istampar
- Id-deskrittur tal-fajl 2 jissejjaħ STDERR u jintuża mill-applikazzjonijiet biex joħroġ messaġġi ta' żball.
Jekk fil-programm tiegħek tiftaħ xi fajl għall-qari jew il-kitba, allura x'aktarx ikollok l-ewwel ID b'xejn u tkun in-numru 3.
Il-lista ta' deskritturi tal-fajls tista' tara għal kwalunkwe proċess jekk taf il-PID tagħha.
Pereżempju, ejja niftħu l-bash console u nħarsu lejn il-PID tal-proċess tagħna
[user@localhost ]$ echo $$
15771
Fit-tieni console ejja niġru
[user@localhost ]$ ls -lah /proc/15771/fd/
total 0
dr-x------ 2 user user 0 Oct 7 15:42 .
dr-xr-xr-x 9 user user 0 Oct 7 15:42 ..
lrwx------ 1 user user 64 Oct 7 15:42 0 -> /dev/pts/21
lrwx------ 1 user user 64 Oct 7 15:42 1 -> /dev/pts/21
lrwx------ 1 user user 64 Oct 7 15:42 2 -> /dev/pts/21
lrwx------ 1 user user 64 Oct 7 15:42 255 -> /dev/pts/21
Tista 'tinjora b'mod sikur id-deskrittur tal-fajl numru 255 għall-finijiet ta' dan l-artikolu; infetaħ għall-bżonnijiet tiegħu minn bash innifsu, u mhux mil-librerija marbuta.
Issa t-3 fajls deskritturi kollha huma assoċjati mal-apparat psewdo terminal
[user@localhost ]$ echo "hello world" > /proc/15771/fd/0
U fl-ewwel console se naraw
[user@localhost ]$ hello world
Redirect u Pipe
Tista' faċilment tegħleb dawn it-3 fajls deskritturi fi kwalunkwe proċess, inkluż f'bash, pereżempju permezz ta' pajp li jgħaqqad żewġ proċessi, ara
[user@localhost ]$ cat /dev/zero | sleep 10000
Tista 'tmexxi dan il-kmand lilek innifsek strace -f u ara x'qed jiġri ġewwa, imma jien ngħidlek fil-qosor.
Il-proċess tal-bash ġenitur tagħna b'PID 15771 janalizza l-kmand tagħna u jifhem eżattament kemm irridu nmexxu kmandi, fil-każ tagħna hemm tnejn minnhom: qattus u rqad. Bash jaf li jeħtieġ li joħloq żewġ proċessi tfal, u jingħaqadhom f'pajp wieħed. B'kollox, bash se jkollu bżonn 2 proċessi tfal u pajp wieħed.
Bash imexxi sejħa tas-sistema qabel ma joħloq proċessi tfal
Għall-proċess ġenitur, jidher li diġà hemm pajp, iżda għad m'hemmx proċessi tfal:
PID command
15771 bash
lrwx------ 1 user user 64 Oct 7 15:42 0 -> /dev/pts/21
lrwx------ 1 user user 64 Oct 7 15:42 1 -> /dev/pts/21
lrwx------ 1 user user 64 Oct 7 15:42 2 -> /dev/pts/21
lrwx------ 1 user user 64 Oct 7 15:42 3 -> pipe:[253543032]
lrwx------ 1 user user 64 Oct 7 15:42 4 -> pipe:[253543032]
lrwx------ 1 user user 64 Oct 7 15:42 255 -> /dev/pts/21
Imbagħad tuża s-sejħa tas-sistema
PID command
15771 bash
lrwx------ 1 user user 64 Oct 7 15:42 0 -> /dev/pts/21
lrwx------ 1 user user 64 Oct 7 15:42 1 -> /dev/pts/21
lrwx------ 1 user user 64 Oct 7 15:42 2 -> /dev/pts/21
lrwx------ 1 user user 64 Oct 7 15:42 3 -> pipe:[253543032]
lrwx------ 1 user user 64 Oct 7 15:42 4 -> pipe:[253543032]
lrwx------ 1 user user 64 Oct 7 15:42 255 -> /dev/pts/21
PID command
9004 bash
lrwx------ 1 user user 64 Oct 7 15:57 0 -> /dev/pts/21
lrwx------ 1 user user 64 Oct 7 15:57 1 -> /dev/pts/21
lrwx------ 1 user user 64 Oct 7 15:57 2 -> /dev/pts/21
lrwx------ 1 user user 64 Oct 7 15:57 3 -> pipe:[253543032]
lrwx------ 1 user user 64 Oct 7 15:57 4 -> pipe:[253543032]
lrwx------ 1 user user 64 Oct 7 15:57 255 -> /dev/pts/21
PID command
9005 bash
lrwx------ 1 user user 64 Oct 7 15:57 0 -> /dev/pts/21
lrwx------ 1 user user 64 Oct 7 15:57 1 -> /dev/pts/21
lrwx------ 1 user user 64 Oct 7 15:57 2 -> /dev/pts/21
lrwx------ 1 user user 64 Oct 7 15:57 3 -> pipe:[253543032]
lrwx------ 1 user user 64 Oct 7 15:57 4 -> pipe:[253543032]
lrwx------ 1 user user 64 Oct 7 15:57 255 -> /dev/pts/21
Tinsiex li l-klonu jikklona l-proċess flimkien mad-deskritturi tal-fajls kollha, sabiex ikunu l-istess fil-proċess ġenitur u f'dawk tat-tfal. Ix-xogħol tal-proċess ġenitur b'PID 15771 huwa li jimmonitorja l-proċessi tat-tfal, għalhekk sempliċement jistenna rispons mit-tfal.
Għalhekk, m'għandux bżonn pajp, u jagħlaq id-deskritturi tal-fajl numerati 3 u 4.
Fl-ewwel proċess ta 'bash tat-tfal b'PID 9004, is-sejħa tas-sistema
Fil-proċess tat-tieni tifel b'PID 9005, bash juża dup2 biex ibiddel id-deskrittur tal-fajl STDIN numru 0. Issa dak kollu li se jaqra t-tieni bash tagħna b'PID 9005 se jinqara mill-pajp.
Wara dan, id-deskritturi tal-fajls numerati 3 u 4 jingħalqu wkoll fil-proċessi tfal, peress li m'għadhomx jintużaw.
Injora deliberatament id-deskrittur tal-fajl 255; jintuża għal skopijiet interni minn bash innifsu u se jingħalaq ukoll fi proċessi tfal.
Sussegwentement, fl-ewwel proċess tifel b'PID 9004, bash jibda juża sejħa tas-sistema
Fil-proċess tat-tieni tifel b'PID 9005, bash imexxi t-tieni eżekutibbli li speċifikajna, fil-każ tagħna /usr/bin/sleep.
Is-sejħa tas-sistema exec ma tagħlaqx il-pumi tal-fajls sakemm ma nfetħux bil-bandiera O_CLOEXEC fil-ħin li saret is-sejħa miftuħa. Fil-każ tagħna, wara t-tnedija tal-fajls eżekutibbli, id-deskritturi tal-fajl attwali kollha se jiġu ffrankati.
Iċċekkja fil-console:
[user@localhost ]$ pgrep -P 15771
9004
9005
[user@localhost ]$ ls -lah /proc/15771/fd/
total 0
dr-x------ 2 user user 0 Oct 7 15:42 .
dr-xr-xr-x 9 user user 0 Oct 7 15:42 ..
lrwx------ 1 user user 64 Oct 7 15:42 0 -> /dev/pts/21
lrwx------ 1 user user 64 Oct 7 15:42 1 -> /dev/pts/21
lrwx------ 1 user user 64 Oct 7 15:42 2 -> /dev/pts/21
lrwx------ 1 user user 64 Oct 7 15:42 255 -> /dev/pts/21
[user@localhost ]$ ls -lah /proc/9004/fd
total 0
dr-x------ 2 user user 0 Oct 7 15:57 .
dr-xr-xr-x 9 user user 0 Oct 7 15:57 ..
lrwx------ 1 user user 64 Oct 7 15:57 0 -> /dev/pts/21
l-wx------ 1 user user 64 Oct 7 15:57 1 -> pipe:[253543032]
lrwx------ 1 user user 64 Oct 7 15:57 2 -> /dev/pts/21
lr-x------ 1 user user 64 Oct 7 15:57 3 -> /dev/zero
[user@localhost ]$ ls -lah /proc/9005/fd
total 0
dr-x------ 2 user user 0 Oct 7 15:57 .
dr-xr-xr-x 9 user user 0 Oct 7 15:57 ..
lr-x------ 1 user user 64 Oct 7 15:57 0 -> pipe:[253543032]
lrwx------ 1 user user 64 Oct 7 15:57 1 -> /dev/pts/21
lrwx------ 1 user user 64 Oct 7 15:57 2 -> /dev/pts/21
[user@localhost ]$ ps -up 9004
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
user 9004 0.0 0.0 107972 620 pts/21 S+ 15:57 0:00 cat /dev/zero
[user@localhost ]$ ps -up 9005
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
user 9005 0.0 0.0 107952 360 pts/21 S+ 15:57 0:00 sleep 10000
Kif tistgħu taraw, in-numru uniku tal-pajp tagħna huwa l-istess fiż-żewġ proċessi. Għalhekk għandna konnessjoni bejn żewġ proċessi differenti mal-istess ġenitur.
Għal dawk li mhumiex familjari mas-sejħiet tas-sistema li juża bash, nirrakkomanda ħafna li tmexxi l-kmandi permezz ta' strace u tara x'qed jiġri internament, pereżempju bħal dan:
strace -s 1024 -f bash -c "ls | grep hello"
Ejja mmorru lura għall-problema tagħna ta 'li jispiċċaw l-ispazju tad-disk u nippruvaw insalvaw id-data mingħajr ma nibdew mill-ġdid il-proċess. Ejja nikteb programm żgħir li se jikteb madwar 1 megabyte kull sekonda fuq disk. Barra minn hekk, jekk għal xi raġuni ma konniex kapaċi niktbu d-dejta fuq id-diska, aħna sempliċement injoraw dan u nippruvaw niktbu d-dejta mill-ġdid f'sekonda. Fl-eżempju li qed nuża Python, tista 'tuża kwalunkwe lingwa ta' programmar oħra.
[user@localhost ]$ cat openforwrite.py
import datetime
import time
mystr="a"*1024*1024+"n"
with open("123.txt", "w") as f:
while True:
try:
f.write(str(datetime.datetime.now()))
f.write(mystr)
f.flush()
time.sleep(1)
except:
pass
Ejja nħaddmu l-programm u nħarsu lejn id-deskritturi tal-fajl
[user@localhost ]$ python openforwrite.py &
[1] 3762
[user@localhost ]$ ps axuf | grep [o]penforwrite
user 3762 0.0 0.0 128600 5744 pts/22 S+ 16:28 0:00 | _ python openforwrite.py
[user@localhost ]$ ls -la /proc/3762/fd
total 0
dr-x------ 2 user user 0 Oct 7 16:29 .
dr-xr-xr-x 9 user user 0 Oct 7 16:29 ..
lrwx------ 1 user user 64 Oct 7 16:29 0 -> /dev/pts/22
lrwx------ 1 user user 64 Oct 7 16:29 1 -> /dev/pts/22
lrwx------ 1 user user 64 Oct 7 16:29 2 -> /dev/pts/22
l-wx------ 1 user user 64 Oct 7 16:29 3 -> /home/user/123.txt
Kif tistgħu taraw, għandna t-3 deskritturi tal-fajl standard tagħna u wieħed ieħor li ftaħna. Ejja niċċekkja d-daqs tal-fajl:
[user@localhost ]$ ls -lah 123.txt
-rw-rw-r-- 1 user user 117M Oct 7 16:30 123.txt
Id-dejta qed tinkiteb, nippruvaw nibdlu l-permessi fuq il-fajl:
[user@localhost ]$ sudo chown root: 123.txt
[user@localhost ]$ ls -lah 123.txt
-rw-rw-r-- 1 root root 168M Oct 7 16:31 123.txt
[user@localhost ]$ ls -lah 123.txt
-rw-rw-r-- 1 root root 172M Oct 7 16:31 123.txt
Naraw li d-data għadha qed tinkiteb, għalkemm l-utent tagħna m'għandux permess biex jikteb fil-fajl. Ejja nippruvaw inneħħuha:
[user@localhost ]$ sudo rm 123.txt
[user@localhost ]$ ls 123.txt
ls: cannot access 123.txt: No such file or directory
Fejn hi miktuba d-dejta? U huma miktuba fil-livelli kollha? Aħna niċċekkjaw:
[user@localhost ]$ ls -la /proc/3762/fd
total 0
dr-x------ 2 user user 0 Oct 7 16:29 .
dr-xr-xr-x 9 user user 0 Oct 7 16:29 ..
lrwx------ 1 user user 64 Oct 7 16:29 0 -> /dev/pts/22
lrwx------ 1 user user 64 Oct 7 16:29 1 -> /dev/pts/22
lrwx------ 1 user user 64 Oct 7 16:29 2 -> /dev/pts/22
l-wx------ 1 user user 64 Oct 7 16:29 3 -> /home/user/123.txt (deleted)
Iva, id-deskrittur tal-fajl tagħna għadu jeżisti u nistgħu nittrattaw dan id-deskrittur tal-fajl bħall-fajl il-qadim tagħna, nistgħu naqraw, nikkopjah u nikkopjah.
Ejja nħarsu lejn id-daqs tal-fajl:
[user@localhost ]$ lsof | grep 123.txt
python 31083 user 3w REG 8,5 19923457 2621522 /home/user/123.txt
Id-daqs tal-fajl huwa 19923457. Ejja nippruvaw inaddfu l-fajl:
[user@localhost ]$ truncate -s 0 /proc/31083/fd/3
[user@localhost ]$ lsof | grep 123.txt
python 31083 user 3w REG 8,5 136318390 2621522 /home/user/123.txt
Kif tistgħu taraw, id-daqs tal-fajl qed jiżdied biss u t-tronk tagħna ma ħadimx. Ejja nħarsu lejn id-dokumentazzjoni tas-sejħa tas-sistema
with open("123.txt", "w") as f:
irridu npoġġu
with open("123.txt", "a") as f:
Iċċekkjar bil-bandiera “w”.
[user@localhost ]$ strace -e trace=open python openforwrite.py 2>&1| grep 123.txt
open("123.txt", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
u bil-bandiera "a".
[user@localhost ]$ strace -e trace=open python openforwrite.py 2>&1| grep 123.txt
open("123.txt", O_WRONLY|O_CREAT|O_APPEND, 0666) = 3
Ipprogrammar proċess li diġà għaddej
Ħafna drabi l-programmaturi, meta joħolqu u jittestjaw programmi, jużaw debuggers (per eżempju GDB) jew diversi livelli ta 'logging fl-applikazzjoni. Linux jipprovdi l-abbiltà li attwalment tikteb u tibdel programm li diġà qed jaħdem, pereżempju, ibiddel il-valuri tal-varjabbli, jistabbilixxi breakpoint, eċċ., eċċ.
Nirritornaw għall-mistoqsija oriġinali dwar mhux biżżejjed spazju fuq disk biex tikteb fajl, ejja nippruvaw nisimulaw il-problema.
Ejja noħolqu fajl għall-partizzjoni tagħna, li se nimmuntaw bħala disk separat:
[user@localhost ~]$ dd if=/dev/zero of=~/tempfile_for_article.dd bs=1M count=10
10+0 records in
10+0 records out
10485760 bytes (10 MB) copied, 0.00525929 s, 2.0 GB/s
[user@localhost ~]$
Ejja noħolqu sistema ta' fajls:
[user@localhost ~]$ mkfs.ext4 ~/tempfile_for_article.dd
mke2fs 1.42.9 (28-Dec-2013)
/home/user/tempfile_for_article.dd is not a block special device.
Proceed anyway? (y,n) y
...
Writing superblocks and filesystem accounting information: done
[user@localhost ~]$
Immonta s-sistema tal-fajls:
[user@localhost ~]$ sudo mount ~/tempfile_for_article.dd /mnt/
[sudo] password for user:
[user@localhost ~]$ df -h | grep mnt
/dev/loop0 8.7M 172K 7.9M 3% /mnt
Noħolqu direttorju mas-sid tagħna:
[user@localhost ~]$ sudo mkdir /mnt/logs
[user@localhost ~]$ sudo chown user: /mnt/logs
Ejja niftħu l-fajl għall-kitba biss fil-programm tagħna:
with open("/mnt/logs/123.txt", "w") as f:
Tnedija
[user@localhost ]$ python openforwrite.py
Nistennew ftit sekondi
[user@localhost ~]$ df -h | grep mnt
/dev/loop0 8.7M 8.0M 0 100% /mnt
Allura, għandna l-problema deskritta fil-bidu ta 'dan l-artikolu. Spazju ħieles 0, 100% okkupat.
Niftakru li skont il-kundizzjonijiet tal-kompitu, qed nippruvaw nirreġistraw data importanti ħafna li ma tistax tintilef. U fl-istess ħin, għandna bżonn nirranġaw is-servizz mingħajr ma nibdew mill-ġdid il-proċess.
Ejja ngħidu li għad għandna spazju fuq disk, iżda f'partizzjoni differenti, pereżempju f'/home.
Ejja nippruvaw "riprogrammaw fuq il-fly" il-kodiċi tagħna.
Ejja nħarsu lejn il-PID tal-proċess tagħna, li kiela l-ispazju kollu tad-diska:
[user@localhost ~]$ ps axuf | grep [o]penfor
user 10078 27.2 0.0 128600 5744 pts/22 R+ 11:06 0:02 | _ python openforwrite.py
Qabbad mal-proċess permezz ta' gdb
[user@localhost ~]$ gdb -p 10078
...
(gdb)
Ejja nħarsu lejn id-deskritturi tal-fajl miftuħa:
(gdb) shell ls -lah /proc/10078/fd/
total 0
dr-x------ 2 user user 0 Oct 8 11:06 .
dr-xr-xr-x 9 user user 0 Oct 8 11:06 ..
lrwx------ 1 user user 64 Oct 8 11:09 0 -> /dev/pts/22
lrwx------ 1 user user 64 Oct 8 11:09 1 -> /dev/pts/22
lrwx------ 1 user user 64 Oct 8 11:06 2 -> /dev/pts/22
l-wx------ 1 user user 64 Oct 8 11:09 3 -> /mnt/logs/123.txt
Inħarsu lejn l-informazzjoni dwar id-deskrittur tal-fajl numru 3, li jinteressana
(gdb) shell cat /proc/10078/fdinfo/3
pos: 8189952
flags: 0100001
mnt_id: 482
Filwaqt li wieħed iżomm f'moħħu liema sejħa tas-sistema tagħmel Python (ara hawn fuq fejn damna strace u sibna s-sejħa miftuħa), meta nipproċessaw il-kodiċi tagħna biex niftħu fajl, nagħmlu l-istess aħna stess f'isem il-proċess tagħna, iżda neħtieġu l-O_WRONLY|O_CREAT| O_TRUNC bits jissostitwixxu b'valur numeriku. Biex tagħmel dan, iftaħ is-sorsi tal-qalba, pereżempju
#define O_WRONLY 00000001
#define O_CREAT 00000100
#define O_TRUNC 00001000
Aħna ngħaqqdu l-valuri kollha f'wieħed, nikseb 00001101
Aħna nmexxu s-sejħa tagħna minn gdb
(gdb) call open("/home/user/123.txt", 00001101,0666)
$1 = 4
Allura ksibna deskrittur tal-fajl ġdid bin-numru 4 u fajl miftuħ ġdid fuq partizzjoni oħra, niċċekkjaw:
(gdb) shell ls -lah /proc/10078/fd/
total 0
dr-x------ 2 user user 0 Oct 8 11:06 .
dr-xr-xr-x 9 user user 0 Oct 8 11:06 ..
lrwx------ 1 user user 64 Oct 8 11:09 0 -> /dev/pts/22
lrwx------ 1 user user 64 Oct 8 11:09 1 -> /dev/pts/22
lrwx------ 1 user user 64 Oct 8 11:06 2 -> /dev/pts/22
l-wx------ 1 user user 64 Oct 8 11:09 3 -> /mnt/logs/123.txt
l-wx------ 1 user user 64 Oct 8 11:15 4 -> /home/user/123.txt
Niftakru l-eżempju bil-pipe - kif bash jibdel id-deskritturi tal-fajls, u diġà tgħallimna s-sejħa tas-sistema dup2.
Nippruvaw nissostitwixxu deskrittur tal-fajl b'ieħor
(gdb) call dup2(4,3)
$2 = 3
Aħna niċċekkjaw:
(gdb) shell ls -lah /proc/10078/fd/
total 0
dr-x------ 2 user user 0 Oct 8 11:06 .
dr-xr-xr-x 9 user user 0 Oct 8 11:06 ..
lrwx------ 1 user user 64 Oct 8 11:09 0 -> /dev/pts/22
lrwx------ 1 user user 64 Oct 8 11:09 1 -> /dev/pts/22
lrwx------ 1 user user 64 Oct 8 11:06 2 -> /dev/pts/22
l-wx------ 1 user user 64 Oct 8 11:09 3 -> /home/user/123.txt
l-wx------ 1 user user 64 Oct 8 11:15 4 -> /home/user/123.txt
Nagħlqu d-deskrittur tal-fajl 4, peress li m'għandniex bżonnu:
(gdb) call close (4)
$1 = 0
U ħruġ gdb
(gdb) quit
A debugging session is active.
Inferior 1 [process 10078] will be detached.
Quit anyway? (y or n) y
Detaching from program: /usr/bin/python2.7, process 10078
Iċċekkja l-fajl il-ġdid:
[user@localhost ~]$ ls -lah /home/user/123.txt
-rw-rw-r-- 1 user user 5.1M Oct 8 11:18 /home/user/123.txt
[user@localhost ~]$ ls -lah /home/user/123.txt
-rw-rw-r-- 1 user user 7.1M Oct 8 11:18 /home/user/123.txt
Kif tistgħu taraw, id-dejta tinkiteb f'fajl ġdid, ejja niċċekkjaw dak il-qadim:
[user@localhost ~]$ ls -lah /mnt/logs/123.txt
-rw-rw-r-- 1 user user 7.9M Oct 8 11:08 /mnt/logs/123.txt
L-ebda data ma tintilef, l-applikazzjoni taħdem, zkuk jinkitbu f'post ġdid.
Ejja nikkomplikaw ftit il-kompitu
Ejja nimmaġinaw li d-dejta hija importanti għalina, iżda m'għandniex spazju fuq id-diska fl-ebda partizzjoni u ma nistgħux nikkonnettjaw id-diska.
Dak li nistgħu nagħmlu huwa nidderieġu d-dejta tagħna x'imkien, pereżempju lejn il-pajp, u min-naħa l-oħra nidderieġu d-dejta mill-pajp għan-netwerk permezz ta 'xi programm, pereżempju netcat.
Nistgħu noħolqu pajp imsemmi bil-kmand mkfifo. Se toħloq psewdo fajl fuq is-sistema tal-fajls anki jekk ma jkunx hemm spazju ħieles fuqha.
Ibda mill-ġdid l-applikazzjoni u ċċekkja:
[user@localhost ]$ python openforwrite.py
[user@localhost ~]$ ps axuf | grep [o]pen
user 5946 72.9 0.0 128600 5744 pts/22 R+ 11:27 0:20 | _ python openforwrite.py
[user@localhost ~]$ ls -lah /proc/5946/fd
total 0
dr-x------ 2 user user 0 Oct 8 11:27 .
dr-xr-xr-x 9 user user 0 Oct 8 11:27 ..
lrwx------ 1 user user 64 Oct 8 11:28 0 -> /dev/pts/22
lrwx------ 1 user user 64 Oct 8 11:28 1 -> /dev/pts/22
lrwx------ 1 user user 64 Oct 8 11:27 2 -> /dev/pts/22
l-wx------ 1 user user 64 Oct 8 11:28 3 -> /mnt/logs/123.txt
[user@localhost ~]$ df -h | grep mnt
/dev/loop0 8.7M 8.0M 0 100% /mnt
M'hemm l-ebda spazju fuq id-diska, iżda aħna noħolqu b'suċċess pajp imsemmi hemmhekk:
[user@localhost ~]$ mkfifo /mnt/logs/megapipe
[user@localhost ~]$ ls -lah /mnt/logs/megapipe
prw-rw-r-- 1 user user 0 Oct 8 11:28 /mnt/logs/megapipe
Issa għandna bżonn b'xi mod nagħżlu d-dejta kollha li tidħol f'dan il-pajp għal server ieħor permezz tan-netwerk; l-istess netcat huwa adattat għal dan.
Fuq is-server remote-server.example.com inniedu
[user@localhost ~]$ nc -l 7777 > 123.txt
Fuq is-server problematiku tagħna nniedu f'terminal separat
[user@localhost ~]$ nc remote-server.example.com 7777 < /mnt/logs/megapipe
Issa d-dejta kollha li tispiċċa fil-pajp se tmur awtomatikament għal stdin f'netcat, li tibgħatha lin-netwerk fuq il-port 7777.
Kulma rridu nagħmlu hu li nibdew niktbu d-dejta tagħna f'dan il-pajp imsemmi.
Diġà għandna l-applikazzjoni taħdem:
[user@localhost ~]$ ps axuf | grep [o]pen
user 5946 99.8 0.0 128600 5744 pts/22 R+ 11:27 169:27 | _ python openforwrite.py
[user@localhost ~]$ ls -lah /proc/5946/fd
total 0
dr-x------ 2 user user 0 Oct 8 11:27 .
dr-xr-xr-x 9 user user 0 Oct 8 11:27 ..
lrwx------ 1 user user 64 Oct 8 11:28 0 -> /dev/pts/22
lrwx------ 1 user user 64 Oct 8 11:28 1 -> /dev/pts/22
lrwx------ 1 user user 64 Oct 8 11:27 2 -> /dev/pts/22
l-wx------ 1 user user 64 Oct 8 11:28 3 -> /mnt/logs/123.txt
Mill-bnadar kollha, għandna bżonn biss O_WRONLY peress li l-fajl diġà jeżisti u m'għandniex bżonn inneħħuh
[user@localhost ~]$ gdb -p 5946
...
(gdb) call open("/mnt/logs/megapipe", 00000001,0666)
$1 = 4
(gdb) shell ls -lah /proc/5946/fd
total 0
dr-x------ 2 user user 0 Oct 8 11:27 .
dr-xr-xr-x 9 user user 0 Oct 8 11:27 ..
lrwx------ 1 user user 64 Oct 8 11:28 0 -> /dev/pts/22
lrwx------ 1 user user 64 Oct 8 11:28 1 -> /dev/pts/22
lrwx------ 1 user user 64 Oct 8 11:27 2 -> /dev/pts/22
l-wx------ 1 user user 64 Oct 8 11:28 3 -> /mnt/logs/123.txt
l-wx------ 1 user user 64 Oct 8 14:20 4 -> /mnt/logs/megapipe
(gdb) call dup2(4,3)
$2 = 3
(gdb) shell ls -lah /proc/5946/fd
total 0
dr-x------ 2 user user 0 Oct 8 11:27 .
dr-xr-xr-x 9 user user 0 Oct 8 11:27 ..
lrwx------ 1 user user 64 Oct 8 11:28 0 -> /dev/pts/22
lrwx------ 1 user user 64 Oct 8 11:28 1 -> /dev/pts/22
lrwx------ 1 user user 64 Oct 8 11:27 2 -> /dev/pts/22
l-wx------ 1 user user 64 Oct 8 11:28 3 -> /mnt/logs/megapipe
l-wx------ 1 user user 64 Oct 8 14:20 4 -> /mnt/logs/megapipe
(gdb) call close(4)
$3 = 0
(gdb) shell ls -lah /proc/5946/fd
total 0
dr-x------ 2 user user 0 Oct 8 11:27 .
dr-xr-xr-x 9 user user 0 Oct 8 11:27 ..
lrwx------ 1 user user 64 Oct 8 11:28 0 -> /dev/pts/22
lrwx------ 1 user user 64 Oct 8 11:28 1 -> /dev/pts/22
lrwx------ 1 user user 64 Oct 8 11:27 2 -> /dev/pts/22
l-wx------ 1 user user 64 Oct 8 11:28 3 -> /mnt/logs/megapipe
(gdb) quit
A debugging session is active.
Inferior 1 [process 5946] will be detached.
Quit anyway? (y or n) y
Detaching from program: /usr/bin/python2.7, process 5946
Iċċekkja s-server remot remote-server.example.com
[user@localhost ~]$ ls -lah 123.txt
-rw-rw-r-- 1 user user 38M Oct 8 14:21 123.txt
Id-dejta ġejja, niċċekkjaw is-server tal-problema
[user@localhost ~]$ ls -lah /mnt/logs/
total 7.9M
drwxr-xr-x 2 user user 1.0K Oct 8 11:28 .
drwxr-xr-x 4 root root 1.0K Oct 8 10:55 ..
-rw-rw-r-- 1 user user 7.9M Oct 8 14:17 123.txt
prw-rw-r-- 1 user user 0 Oct 8 14:22 megapipe
Id-dejta tiġi ffrankata, il-problema tiġi solvuta.
Nieħu din l-opportunità biex ngħid bonjour lill-kollegi tiegħi minn Degiro.
Isma l-podcasts tar-Radju-T.
Kollox sew.
Bħala xogħol tad-dar, nissuġġerixxi li taħseb dwar x'se jkun hemm fid-deskritturi tal-fajl tal-proċess cat and sleep jekk tmexxi l-kmand li ġej:
[user@localhost ~]$ cat /dev/zero 2>/dev/null| sleep 10000
Sors: www.habr.com