Apejuwe faili ni Linux pẹlu awọn apẹẹrẹ

Ni ẹẹkan, lakoko ifọrọwanilẹnuwo, a beere lọwọ mi, kini iwọ yoo ṣe ti o ba rii iṣẹ kan ti ko ṣiṣẹ nitori otitọ pe disk naa ti pari ni aaye?

Dajudaju, Mo dahun pe Emi yoo rii ohun ti o gba nipasẹ ibi yii ati pe, ti o ba ṣeeṣe, Emi yoo sọ ibi naa di mimọ.
Lẹhinna olubẹwo naa beere, kini ti ko ba si aaye ọfẹ lori ipin, ṣugbọn iwọ ko tun rii eyikeyi awọn faili ti yoo gba gbogbo aaye naa?

Lati eyi Mo sọ pe o le nigbagbogbo wo awọn apejuwe faili ṣiṣi, fun apẹẹrẹ pẹlu aṣẹ lsof, ki o loye iru ohun elo ti o gba gbogbo aaye ti o wa, lẹhinna o le ṣe ni ibamu si awọn ipo, da lori boya o nilo data naa. .

Onirohin naa da mi duro lori ọrọ ti o kẹhin, ti o fi kun si ibeere rẹ: "Ti a ko nilo data naa, o kan jẹ aṣiṣe aṣiṣe, ṣugbọn ohun elo naa ko ṣiṣẹ nitori ko le kọ aṣiṣe kan"?

“Dara,” Mo dahun, “a le paa yokokoro ni atunto ohun elo ki a tun bẹrẹ.”
Olubẹwẹ naa tako: “Rara, a ko le tun ohun elo naa bẹrẹ, a tun ni data pataki ti a fipamọ sinu iranti, ati pe awọn alabara pataki ti sopọ mọ iṣẹ naa funrararẹ, eyiti a ko le fi ipa mu lati tun sopọ mọ.”

“Dara,” Mo sọ, “ti a ko ba le tun ohun elo naa bẹrẹ ati pe data ko ṣe pataki si wa, lẹhinna a le jiroro ni nu faili ṣiṣi yii kuro nipasẹ oluṣapejuwe faili, paapaa ti a ko ba rii ni aṣẹ ls lori eto faili."

Inú olùfọ̀rọ̀wánilẹ́nuwò náà dùn, ṣùgbọ́n mi ò rí bẹ́ẹ̀.

Nigbana ni mo ro pe, kilode ti eniyan naa ko ṣe idanwo imọ mi jinlẹ? Ṣugbọn kini ti data ba ṣe pataki lẹhin gbogbo? Kini ti a ko ba le tun ilana kan bẹrẹ, ati ilana naa kọwe si eto faili lori ipin ti ko ni aaye ọfẹ? Kini ti a ko ba le padanu kii ṣe data nikan ti a ti kọ tẹlẹ, ṣugbọn tun data ti ilana yii kọ tabi gbiyanju lati kọ?

Tuzik

Ni kutukutu iṣẹ mi, Mo gbiyanju lati ṣẹda ohun elo kekere kan ti o nilo lati tọju alaye olumulo. Ati lẹhinna Mo ronu, bawo ni MO ṣe le baamu olumulo si data rẹ. Fun apẹẹrẹ, Mo ni Ivanov Ivan Ivanovich, ati pe o ni alaye diẹ, ṣugbọn bawo ni MO ṣe le ṣe ọrẹ pẹlu wọn? Mo le tọka si taara pe aja ti a npè ni "Tuzik" jẹ ti Ivan yii. Ṣugbọn kini ti o ba yi orukọ rẹ pada ati dipo Ivan di, fun apẹẹrẹ, Olya? Lẹhinna o yoo jade pe Olya Ivanovna Ivanova wa ko ni ni aja kan mọ, ati Tuzik wa yoo tun jẹ ti Ivan ti ko si tẹlẹ. Ipamọ data ti o fun olumulo kọọkan ni idanimọ alailẹgbẹ (ID) ṣe iranlọwọ lati yanju iṣoro yii, ati pe Tuzik mi ni a so mọ ID yii, eyiti, ni otitọ, jẹ nọmba ni tẹlentẹle nikan. Bayi, oniwun tuzik ni nọmba ID 2, ati ni akoko diẹ Ivan wa labẹ ID yii, lẹhinna Olya di labẹ ID kanna. Iṣoro ti eda eniyan ati ẹran-ọsin ni a ti yanju ni adaṣe.

Apejuwe faili

Iṣoro faili ati eto ti o ṣiṣẹ pẹlu faili yii jẹ isunmọ kanna bii ti aja ati eniyan wa. Ṣebi Mo ṣii faili kan ti a pe ni ivan.txt ati bẹrẹ kikọ ọrọ tuzik sinu rẹ, ṣugbọn iṣakoso nikan lati kọ lẹta akọkọ “t” ninu faili naa, ati pe faili yii jẹ lorukọmii nipasẹ ẹnikan, fun apẹẹrẹ, si olya.txt. Ṣugbọn faili naa wa kanna, ati pe Mo tun fẹ lati ṣe igbasilẹ Ace mi ninu rẹ. Ni gbogbo igba ti faili ba ṣii nipasẹ ipe eto kan ìmọ ni eyikeyi ede siseto Mo gba ID alailẹgbẹ kan ti o tọka mi si faili kan, ID yii ni oluṣapejuwe faili. Ati pe ko ṣe pataki ni gbogbo kini ati tani yoo ṣe pẹlu faili ti o tẹle, o le parẹ, o le tunrukọ, o le yipada oniwun, tabi ẹtọ lati ka ati kọ le gba kuro, Emi yoo tun ni iwọle si. si i, nitori ni akoko ṣiṣi faili naa, Mo ni awọn ẹtọ lati ka ati / tabi kọ ati pe Mo ṣakoso lati bẹrẹ ṣiṣẹ pẹlu rẹ, eyi ti o tumọ si pe emi gbọdọ tẹsiwaju lati ṣe bẹ.

Ni Lainos, ile-ikawe libc ṣii awọn faili alapejuwe 3 fun ohun elo nṣiṣẹ kọọkan (ilana), nọmba 0,1,2. Alaye diẹ sii ni a le rii lori awọn ọna asopọ ọkunrin stdio и ọkunrin stdout

  • Apejuwe faili 0 ni a pe ni STDIN ati pe o ni nkan ṣe pẹlu titẹ ohun elo
  • Apejuwe faili 1 ni a pe ni STDOUT ati pe awọn ohun elo lo lati gbejade data, gẹgẹbi awọn aṣẹ titẹ
  • Apejuwe faili 2 ni a pe ni STDERR ati pe awọn ohun elo lo lati gbejade awọn ifiranṣẹ aṣiṣe.

Ti o ba wa ninu eto rẹ ti o ṣii eyikeyi faili fun kika tabi kikọ, lẹhinna o ṣeese julọ iwọ yoo gba ID ọfẹ akọkọ ati pe yoo jẹ nọmba 3.

Awọn atokọ ti awọn apejuwe faili le ṣee wo fun ilana eyikeyi ti o ba mọ PID rẹ.

Fun apẹẹrẹ, jẹ ki a ṣii console bash ki o wo PID ti ilana wa

[user@localhost ]$ echo $$
15771

Ni awọn keji console jẹ ki ká ṣiṣe

[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

O le foju foju foju foju nọmba olutumọ faili 255 lailewu fun awọn idi ti nkan yii; o ṣii fun awọn iwulo rẹ nipasẹ bash funrararẹ, kii ṣe nipasẹ ile-ikawe ti o sopọ mọ.

Bayi gbogbo awọn faili apejuwe 3 ni nkan ṣe pẹlu ẹrọ ebute pseudo /dev/pts, sugbon a tun le riboribo wọn, fun apẹẹrẹ, ṣiṣe wọn ni a keji console

[user@localhost ]$ echo "hello world" > /proc/15771/fd/0

Ati ni akọkọ console a yoo ri

[user@localhost ]$ hello world

Àtúnjúwe ati Pipe

O le ni rọọrun daarẹ awọn faili apejuwe 3 wọnyi ni eyikeyi ilana, pẹlu ni bash, fun apẹẹrẹ nipasẹ paipu kan ti o so awọn ilana meji pọ, wo

[user@localhost ]$ cat /dev/zero | sleep 10000

O le ṣiṣe aṣẹ yii funrararẹ pẹlu strace -f ati ki o wo ohun ti n ṣẹlẹ ninu, sugbon Emi yoo so fun o ni soki.

Ilana bash obi wa pẹlu PID 15771 ṣe itupalẹ aṣẹ wa ati loye deede iye awọn aṣẹ ti a fẹ ṣiṣẹ, ninu ọran wa awọn meji wa: ologbo ati oorun. Bash mọ pe o nilo lati ṣẹda awọn ilana ọmọ meji, ki o si dapọ wọn sinu paipu kan. Ni apapọ, bash yoo nilo awọn ilana ọmọ 2 ati paipu kan.

Bash nṣiṣẹ ipe eto ṣaaju ṣiṣẹda awọn ilana ọmọ pipe ati ki o gba titun faili descriptors lori awọn ibùgbé paipu saarin, sugbon yi saarin ko sibẹsibẹ so wa meji ọmọ lakọkọ.

Fun ilana obi, o dabi pe paipu ti wa tẹlẹ, ṣugbọn ko si awọn ilana ọmọ sibẹsibẹ:

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

Lẹhinna lo ipe eto oniye bash ṣẹda awọn ilana ọmọde meji, ati awọn ilana mẹta wa yoo dabi eyi:

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

Maṣe gbagbe pe ẹda oniye ṣe ilana naa pẹlu gbogbo awọn apejuwe faili, nitorinaa wọn yoo jẹ kanna ni ilana obi ati ninu awọn ọmọ. Iṣẹ ti ilana obi pẹlu PID 15771 ni lati ṣe atẹle awọn ilana ọmọ, nitorinaa o kan duro fun esi lati ọdọ awọn ọmọde.

Nitorinaa, ko nilo paipu, ati pe o tilekun awọn apejuwe faili ti o jẹ nọmba 3 ati 4.

Ninu ilana bash ọmọ akọkọ pẹlu PID 9004, ipe eto naa dup2, yi pada wa STDOUT faili apejuwe nọmba 1 to a faili apejuwe awọn ntokasi si paipu, ninu wa nla ti o jẹ nọmba 3. Bayi, ohun gbogbo ti akọkọ ọmọ ilana pẹlu PID 9004 kowe si STDOUT yoo laifọwọyi mu soke ni paipu saarin.

Ninu ilana ọmọ keji pẹlu PID 9005, bash nlo dup2 lati yi olupe faili STDIN nọmba 0. Bayi ohun gbogbo ti bash keji wa pẹlu PID 9005 yoo ka ni yoo ka lati paipu.

Lẹhin eyi, awọn apejuwe faili ti nọmba 3 ati 4 tun wa ni pipade ni awọn ilana ọmọde, nitori wọn ko lo wọn mọ.

Mo mọọmọ foju foju asọye faili 255; o jẹ lilo fun awọn idi inu nipasẹ bash funrararẹ ati pe yoo tun wa ni pipade ni awọn ilana ọmọde.

Nigbamii, ni ilana ọmọ akọkọ pẹlu PID 9004, bash bẹrẹ lilo ipe eto kan exec faili ti o le ṣiṣẹ ti a ṣalaye lori laini aṣẹ, ninu ọran wa o jẹ /usr/bin/cat.

Ninu ilana ọmọ keji pẹlu PID 9005, bash nṣiṣẹ iṣẹ ṣiṣe keji ti a pato, ninu ọran wa / usr / bin / orun.

Ipe eto exec ko pa awọn imudani faili ayafi ti wọn ba ṣii pẹlu asia O_CLOEXEC ni akoko ti ipe ṣiṣi silẹ. Ninu ọran wa, lẹhin ifilọlẹ awọn faili ti o ṣiṣẹ, gbogbo awọn apejuwe faili lọwọlọwọ yoo wa ni fipamọ.

Ṣayẹwo inu 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

Bii o ti le rii, nọmba alailẹgbẹ ti paipu wa jẹ kanna ni awọn ilana mejeeji. Nitorinaa a ni asopọ laarin awọn ilana oriṣiriṣi meji pẹlu obi kanna.

Fun awọn ti ko faramọ pẹlu awọn ipe eto ti bash nlo, Mo ṣeduro gaan ṣiṣe awọn aṣẹ nipasẹ strace ati wiwo ohun ti n ṣẹlẹ ni inu, fun apẹẹrẹ bii eyi:

strace -s 1024 -f bash -c "ls | grep hello"

Jẹ ki a pada si iṣoro wa pẹlu aaye disk kekere ati igbiyanju lati ṣafipamọ data laisi tun ilana naa bẹrẹ. Jẹ ki a kọ eto kekere kan ti yoo kọ to 1 megabyte fun iṣẹju kan si disk. Pẹlupẹlu, ti o ba jẹ fun idi kan a ko lagbara lati kọ data si disk, a yoo foju foju kọ eyi ki a gbiyanju lati kọ data lẹẹkansi ni iṣẹju-aaya kan. Ninu apẹẹrẹ ti Mo nlo Python, o le lo eyikeyi ede siseto miiran.

[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

Jẹ ki a ṣiṣẹ eto naa ki o wo awọn apejuwe faili

[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

Bii o ti le rii, a ni awọn apejuwe faili boṣewa 3 wa ati ọkan diẹ sii ti a ṣii. Jẹ ki a ṣayẹwo iwọn faili naa:

[user@localhost ]$ ls -lah 123.txt 
-rw-rw-r-- 1 user user 117M Oct  7 16:30 123.txt

A ti kọ data naa, a gbiyanju lati yi awọn igbanilaaye pada lori faili naa:

[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

A rii pe a tun kọ data naa, botilẹjẹpe olumulo wa ko ni igbanilaaye lati kọ si faili naa. Jẹ ki a gbiyanju lati yọ kuro:

[user@localhost ]$ sudo rm 123.txt 
[user@localhost ]$ ls 123.txt
ls: cannot access 123.txt: No such file or directory

Nibo ni a ti kọ data naa? Ati pe a kọ wọn rara? A ṣayẹwo:

[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)

Bẹẹni, oluṣapejuwe faili wa ṣi wa ati pe a le tọju oluṣapejuwe faili yii bi faili atijọ wa, a le ka, ko o ati daakọ rẹ.

Jẹ ki a wo iwọn faili naa:

[user@localhost ]$ lsof | grep 123.txt
python    31083             user    3w      REG                8,5   19923457   2621522 /home/user/123.txt

Iwọn faili naa jẹ 19923457. Jẹ ki a gbiyanju lati ko faili naa kuro:

[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

Bii o ti le rii, iwọn faili n pọ si nikan ati ẹhin mọto wa ko ṣiṣẹ. Jẹ ki a wo awọn iwe ipe eto ìmọ. Ti a ba lo asia O_APPEND nigba ṣiṣi faili kan, lẹhinna pẹlu kikọ kọọkan, ẹrọ ṣiṣe n ṣayẹwo iwọn faili ati kọ data si opin faili naa, ati pe o ṣe eyi ni atomiki. Eyi ngbanilaaye ọpọlọpọ awọn okun tabi awọn ilana lati kọ si faili kanna. Ṣugbọn ninu koodu wa a ko lo asia yii. A le rii iwọn faili ti o yatọ ni lsof lẹhin ẹhin mọto nikan ti a ba ṣii faili naa fun kikọ ni afikun, eyiti o tumọ si ni koodu wa dipo

with open("123.txt", "w") as f:

a ni lati fi

with open("123.txt", "a") as f:

Ṣiṣayẹwo pẹlu asia “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

ati pẹlu asia "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

Siseto ilana ti nṣiṣẹ tẹlẹ

Nigbagbogbo awọn pirogirama, nigba ṣiṣẹda ati idanwo awọn eto, lo awọn olutọpa (fun apẹẹrẹ GDB) tabi awọn ipele pupọ ti gedu ninu ohun elo naa. Lainos n pese agbara lati kọ gangan ati yi eto ti nṣiṣẹ tẹlẹ pada, fun apẹẹrẹ, yi awọn iye ti awọn oniyipada pada, ṣeto aaye fifọ, ati bẹbẹ lọ, ati bẹbẹ lọ.

Pada si ibeere atilẹba nipa ko to aaye disk lati kọ faili kan, jẹ ki a gbiyanju lati ṣe adaṣe iṣoro naa.

Jẹ ki a ṣẹda faili kan fun ipin wa, eyiti a yoo gbe bi disk lọtọ:

[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 ~]$

Jẹ ki a ṣẹda eto faili kan:

[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 ~]$

Gbe eto faili naa:

[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

A ṣẹda itọsọna kan pẹlu oniwun wa:

[user@localhost ~]$ sudo mkdir /mnt/logs
[user@localhost ~]$ sudo chown user: /mnt/logs

Jẹ ki a ṣii faili fun kikọ nikan ninu eto wa:

with open("/mnt/logs/123.txt", "w") as f:

Ifilọlẹ

[user@localhost ]$ python openforwrite.py 

A duro kan diẹ aaya

[user@localhost ~]$ df -h | grep mnt
/dev/loop0      8.7M  8.0M     0 100% /mnt

Nitorinaa, a ni iṣoro ti a ṣalaye ni ibẹrẹ nkan yii. Aaye ọfẹ 0, 100% ti tẹdo.

A ranti pe ni ibamu si awọn ipo ti iṣẹ-ṣiṣe, a n gbiyanju lati ṣe igbasilẹ data pataki ti ko le padanu. Ati ni akoko kanna, a nilo lati ṣatunṣe iṣẹ naa laisi tun bẹrẹ ilana naa.

Jẹ ki a sọ pe a tun ni aaye disk, ṣugbọn ni ipin ti o yatọ, fun apẹẹrẹ ni / ile.

Jẹ ká gbiyanju lati "reprogram lori awọn fly" wa koodu.

Jẹ ki a wo PID ti ilana wa, eyiti o jẹ gbogbo aaye disk:

[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

Sopọ si ilana nipasẹ gdb

[user@localhost ~]$ gdb -p 10078
...
(gdb) 

Jẹ ki a wo awọn apejuwe faili ṣiṣi:

(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

A wo alaye nipa nọmba oluṣapejuwe faili 3, eyiti o nifẹ si wa

(gdb) shell cat /proc/10078/fdinfo/3
pos:    8189952
flags:  0100001
mnt_id: 482

Ni lokan ohun ti eto ti a npe ni Python ṣe (wo loke ibi ti a ti ran strace ati ki o ri awọn ìmọ ipe), nigba ti a ba ṣiṣẹ koodu wa lati ṣii faili, a ṣe kanna fun ara wa fun ilana wa, sugbon a nilo awọn O_WRONLY|O_CREAT| O_TRUNC die-die ropo pẹlu kan nomba iye. Lati ṣe eyi, ṣii awọn orisun kernel, fun apẹẹrẹ nibi ati ki o wo eyi ti awọn asia ni o wa lodidi fun ohun ti

# setumo O_WRONLY 00000001
# setumo O_CREAT 00000100
# asọye O_TRUNC 00001000

A darapọ gbogbo awọn iye sinu ọkan, a gba 00001101

A nṣiṣẹ ipe wa lati gdb

(gdb) call open("/home/user/123.txt", 00001101,0666)
$1 = 4

Nitorinaa a ni apejuwe faili tuntun pẹlu nọmba 4 ati faili ṣiṣi tuntun lori ipin miiran, a ṣayẹwo:

(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

A ranti apẹẹrẹ pẹlu paipu - bawo ni bash ṣe yipada awọn apejuwe faili, ati pe a ti kọ tẹlẹ ipe eto dup2.

A gbiyanju lati ropo ọkan faili apejuwe pẹlu miiran

(gdb) call dup2(4,3)
$2 = 3

A ṣayẹwo:

(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

A pa apejuwe faili 4, nitori a ko nilo rẹ:

(gdb) call close (4)
$1 = 0

Ati ki o jade 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ṣayẹwo faili tuntun:

[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

Bii o ti le rii, data ti kọ si faili tuntun, jẹ ki a ṣayẹwo ti atijọ:

[user@localhost ~]$ ls -lah /mnt/logs/123.txt 
-rw-rw-r-- 1 user user 7.9M Oct  8 11:08 /mnt/logs/123.txt

Ko si data ti o sọnu, ohun elo naa n ṣiṣẹ, awọn akọọlẹ ti kọ si ipo tuntun.

Jẹ ki ká complicate awọn iṣẹ-ṣiṣe kekere kan

Jẹ ki a fojuinu pe data naa ṣe pataki fun wa, ṣugbọn a ko ni aaye disk ni eyikeyi awọn ipin ati pe a ko le sopọ disk naa.

Ohun ti a le ṣe ni atunṣe data wa ni ibikan, fun apẹẹrẹ si paipu, ati ni titan darí data lati paipu si nẹtiwọki nipasẹ diẹ ninu awọn eto, fun apẹẹrẹ netcat.
A le ṣẹda paipu ti a npè ni pẹlu aṣẹ mkfifo. Yoo ṣẹda faili pseudo kan lori eto faili paapaa ti ko ba si aaye ọfẹ lori rẹ.

Tun ohun elo naa bẹrẹ ki o ṣayẹwo:

[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

Ko si aaye disk, ṣugbọn a ṣaṣeyọri ṣẹda paipu ti a darukọ nibẹ:

[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

Bayi a nilo lati fi ipari si gbogbo data ti o lọ sinu paipu yii si olupin miiran nipasẹ nẹtiwọọki; netcat kanna dara fun eyi.

Lori olupin remote-server.example.com a ṣe ifilọlẹ

[user@localhost ~]$ nc -l 7777 > 123.txt 

Lori olupin iṣoro wa a ṣe ifilọlẹ ni ebute lọtọ

[user@localhost ~]$ nc remote-server.example.com 7777 < /mnt/logs/megapipe 

Bayi gbogbo data ti o pari ni paipu yoo lọ laifọwọyi si stdin ni netcat, eyiti yoo firanṣẹ si nẹtiwọki lori ibudo 7777.

Gbogbo ohun ti a ni lati ṣe ni bẹrẹ kikọ data wa sinu paipu ti a npè ni yii.

A ti ni ohun elo ti nṣiṣẹ tẹlẹ:

[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

Ninu gbogbo awọn asia, a nilo O_WRONLY nikan niwọn igba ti faili ti wa tẹlẹ ati pe a ko nilo lati nu kuro

[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ṣayẹwo olupin latọna jijin remote-server.example.com

[user@localhost ~]$ ls -lah 123.txt 
-rw-rw-r-- 1 user user 38M Oct  8 14:21 123.txt

Awọn data ti wa ni bọ, a ṣayẹwo awọn isoro olupin

[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

Awọn data ti wa ni fipamọ, awọn isoro ti wa ni re.

Mo fi asiko yi ki awon elegbe mi lati Degiro.
Tẹtisi awọn adarọ-ese Redio-T.

Gbogbo ire.

Gẹgẹbi iṣẹ amurele, Mo daba pe ki o ronu nipa kini yoo wa ninu awọn asọye faili ilana ologbo ati oorun ti o ba ṣiṣẹ aṣẹ wọnyi:

[user@localhost ~]$ cat /dev/zero 2>/dev/null| sleep 10000

orisun: www.habr.com

Fi ọrọìwòye kun