Deskrittur tal-fajl fil-Linux b'eżempji

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 tiftaħ fi kwalunkwe lingwa ta' programmar nirċievi ID unika li tindika fajl, din l-ID hija d-deskrittur tal-fajl. U ma jimpurtax xejn x'jagħmel u min imiss b'dan il-fajl, jista' jitħassar, jista' jingħata isem ġdid, is-sid jista' jinbidel, jew id-drittijiet tal-qari u tal-kitba jistgħu jitneħħew, xorta se jkolli aċċess għaliha, għax fil-ħin li ftaħ il-file, kelli d-drittijiet naqra u/jew nikteb u rnexxieli nibda naħdem miegħu, li jfisser li rrid nibqa’ nagħmel.

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 man stdio и man stdout

  • 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 /dev/pts, iżda xorta nistgħu jimmanipulawhom, pereżempju, imexxuhom fit-tieni console

[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 pajp u jirċievi deskritturi tal-fajls ġodda fuq il-buffer tal-pajp temporanju, iżda dan il-buffer għadu ma jgħaqqadx iż-żewġ proċessi tat-tfal tagħna.

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 klonu bash joħloq żewġ proċessi tfal, u t-tliet proċessi tagħna se jidhru bħal dan:

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 dup2, jibdel id-deskrittur tal-fajl STDOUT tagħna numru 1 għal deskrittur tal-fajl li jipponta lejn il-pajp, fil-każ tagħna huwa n-numru 3. Għalhekk, dak kollu li l-ewwel proċess tat-tifel b'PID 9004 jikteb lil STDOUT awtomatikament jispiċċa fil-buffer tal-pajp.

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 Exec il-fajl eżekutibbli li speċifikajna fuq il-linja tal-kmand, fil-każ tagħna huwa /usr/bin/cat.

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 tiftaħ. Jekk nużaw il-bandiera O_APPEND meta niftħu fajl, imbagħad ma 'kull kitba, is-sistema operattiva tiċċekkja d-daqs tal-fajl u tikteb id-data sa l-aħħar nett tal-fajl, u tagħmel dan atomikament. Dan jippermetti diversi ħjut jew proċessi biex jiktbu fl-istess fajl. Iżda fil-kodiċi tagħna ma nużawx din il-bandiera. Nistgħu naraw daqs differenti tal-fajl f'lsof wara t-trunk biss jekk niftħu l-fajl għal kitba addizzjonali, li jfisser minflok fil-kodiċi tagħna

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 hawn u ħares lejn liema bnadar huma responsabbli għal xiex

#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

Żid kumment