Famaritana fisie amin'ny Linux misy ohatra

Indray mandeha, nandritra ny tafatafa iray, dia nanontaniana aho, inona no hataonao raha mahita serivisy tsy mandeha ianao noho ny tsy fisian'ny habaka?

Mazava ho azy fa namaly aho fa hojereko izay misy an'io toerana io ary, raha azo atao, dia hanadio ilay toerana aho.
Dia nanontany ilay mpanadihady hoe, ahoana raha tsy misy toerana malalaka eo amin'ny fizarazarana, nefa tsy hitanao koa izay rakitra mety haka ny habaka rehetra?

Tamin'izany dia nilaza aho fa afaka mijery ireo mpamoritra rakitra misokatra foana ianao, ohatra amin'ny baiko lsof, ary fantaro hoe iza no fampiharana naka ny habaka rehetra misy, ary avy eo dia afaka mihetsika araka ny toe-javatra ianao, miankina amin'ny hoe ilaina ny data. .

Ny mpanadihady dia nanapaka ahy tamin'ny teny farany, nanampy tamin'ny fanontaniany hoe: "Eritrereto hoe tsy mila ny angon-drakitra izahay, dia log debug fotsiny io, fa tsy mandeha ny fampiharana satria tsy afaka manoratra debug"?

"Eny," hoy aho namaly, "afaka mamono ny debug ao amin'ny config fampiharana ary mamerina azy indray."
Nanohitra ilay mpanadihady hoe: "Tsia, tsy afaka mamerina ny fampiharana izahay, mbola manana angon-drakitra manan-danja voatahiry ao anaty fitadidiana izahay, ary ny mpanjifa manan-danja dia mifandray amin'ny serivisy, izay tsy azontsika terena hifandray indray."

"eny ary," hoy aho, "raha tsy afaka mamerina ny fampiharana isika ary tsy manan-danja amintsika ny angon-drakitra, dia azonao atao ny mamafa ity rakitra misokatra ity amin'ny alΓ lan'ny famaritana ny rakitra, na dia tsy hitanay ao amin'ny baiko ls aza izany. amin'ny rafitra fichier."

Faly ilay mpanadinadina, fa tsy izaho.

Dia nieritreritra aho hoe, nahoana no tsy mihady lalina kokoa ilay olona mitsapa ny fahalalako? Ahoana anefa raha zava-dehibe ny angon-drakitra? Ahoana raha tsy afaka mamerina dingana iray isika, ary manoratra amin'ny rafi-drakitra amin'ny fizarazarana tsy misy habaka malalaka ny dingana? Ahoana raha tsy ny angon-drakitra efa voasoratra ihany no mety ho very, fa koa ny angon-drakitra izay soratan'ity dingana ity na ezahina soratana?

Tuzik

Tany am-piandohan'ny asako dia nanandrana namorona rindranasa kely mila fitahirizana ny mombamomba ny mpampiasa aho. Ary avy eo nieritreritra aho hoe ahoana no ahafahako mampifanaraka ny mpampiasa amin'ny angonany. Ohatra, manana an'i Ivanov Ivan Ivanovich aho, ary manana fampahalalana vitsivitsy izy, saingy ahoana no ahafahako minamana amin'izy ireo? Azoko marihina mivantana fa an'io Ivan io ilay alika antsoina hoe "Tuzik". Ahoana anefa raha hanova ny anarany izy, ary ho solon'i Ivan lasa, ohatra, Olya? Avy eo dia ho hita fa tsy hanana alika intsony ny Olya Ivanovna Ivanova, ary ny Tuzik-nay dia mbola ho an'i Ivan tsy misy. Nanampy tamin'ny famahana ity olana ity ny angon-drakitra iray izay nanome ny mpampiasa tsirairay ny famantarana (ID) tokana, ary ny Tuzik-ko dia nafatotra tamin'ity ID ity, izay, raha ny marina, dia laharana serial fotsiny. Noho izany, ny tompon'ilay ace dia nanana ID laharana 2, ary tamin'ny fotoana iray dia teo ambanin'io ID io i Ivan, ary avy eo dia lasa teo ambanin'ny ID mitovy i Olya. Saika voavaha ny olan'ny olombelona sy ny fiompiana.

Famaritana rakitra

Ny olan'ny rakitra sy ny programa miasa miaraka amin'ity rakitra ity dia mitovy amin'ny an'ny alika sy ny lehilahy. Eritrereto hoe nanokatra rakitra antsoina hoe ivan.txt aho ary nanomboka nanoratra ny teny hoe tuzik tao, fa ny litera voalohany "t" ihany no vitako tao amin'ilay rakitra, ary io rakitra io dia nosoloan'olona iray, ohatra, ho olya.txt. Saingy ny rakitra dia tsy miova, ary mbola te-handrakitra ny ace-ko ao aho. Isaky ny misy rakitra misokatra amin'ny alΓ lan'ny antso an-tariby misokatra Amin'ny fiteny fandaharana rehetra dia mahazo ID tokana izay manondro ahy amin'ny rakitra iray aho, ity ID ity dia ny famaritana ny rakitra. Ary tsy maninona na inona na inona ary iza no manao an'ity dossier manaraka ity, azo esorina, azo soloina anarana, azo ovaina ny tompony, na azo esorina ny zo mamaky sy manoratra, mbola hahazoako miditra. amin'izany, satria tamin'ny fotoana nanokafana ny rakitra dia nanana zo hamaky sy/na hanoratra azy aho ary nahavita nanomboka niasa tamin'izany, izay midika fa tsy maintsy manohy izany aho.

Ao amin'ny Linux, ny tranomboky libc dia manokatra rakitra descriptor 3 ho an'ny rindranasa tsirairay (process), misy isa 0,1,2. Misy fampahalalana bebe kokoa azo jerena ao amin'ny rohy man stdio ΠΈ man stdout

  • Ny famaritana ny rakitra 0 dia antsoina hoe STDIN ary mifandray amin'ny fampidirana fampiharana
  • Ny famaritana fisie 1 dia antsoina hoe STDOUT ary ampiasain'ny fampiharana hamoahana angona, toy ny baiko fanontana
  • Ny famaritana ny rakitra 2 dia antsoina hoe STDERR ary ampiasain'ny fampiharana hamoaka hafatra diso.

Raha manokatra rakitra ho an'ny famakiana na fanoratana ao amin'ny programanao ianao, dia azo inoana fa hahazo ny ID maimaim-poana voalohany ianao ary ho laharana 3 izany.

Ny lisitry ny mpamoritra rakitra dia azo jerena amin'ny dingana rehetra raha fantatrao ny PID-ny.

Ohatra, andao hanokatra ny console bash ary hijery ny PID amin'ny dingana ataontsika

[user@localhost ]$ echo $$
15771

Ao amin'ny console faharoa andao hihazakazaka

[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

Azonao atao ny tsy miraharaha ny fisie descriptor laharana 255 ho an'ny tanjon'ity lahatsoratra ity; nosokafana ho an'ny filany tamin'ny alΓ lan'ny bash mihitsy izy io, fa tsy tamin'ny tranomboky mifandray.

Ankehitriny ny rakitra descriptor 3 rehetra dia mifandray amin'ny fitaovana pseudo terminal /dev/pts, fa mbola afaka manodinkodina azy ireo isika, ohatra, mampandeha azy ireo amin'ny console faharoa

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

Ary amin'ny console voalohany ho hitantsika

[user@localhost ]$ hello world

Redirect sy Pipe

Azonao atao ny manafoana mora foana ireo rakitra descriptor 3 ireo amin'ny dingana rehetra, ao anatin'izany ny bash, ohatra amin'ny alΓ lan'ny fantsona mampifandray ireo dingana roa, jereo

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

Azonao atao ny mampandeha ity baiko ity amin'ny tenanao strace -f ary jereo ny ao anatiny fa holazaiko fohifohy.

Ny fizotry ny bash ray aman-dreninay miaraka amin'ny PID 15771 dia mamadika ny baikonay ary mahatakatra tsara ny isan'ny baiko tiana atao, raha ny anay dia misy roa amin'izy ireo: saka sy torimaso. Fantatr'i Bash fa mila mamorona dingana roa amin'ny ankizy izy, ary manambatra azy ireo ho fantsona iray. Amin'ny fitambarany, ny bash dia mila fizotry ny zaza 2 ary fantsona iray.

Bash dia manao antso an-tariby alohan'ny hamoronana ny fizotran'ny ankizy sodina ary mandray famaritana rakitra vaovao amin'ny buffer sodina vonjimaika, saingy tsy mbola mampifandray ny fizotran'ny zanatsika roa io buffer io.

Ho an'ny fizotry ny ray aman-dreny dia toa efa misy ny fantsona, saingy tsy mbola misy ny fizotran'ny zaza:

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

Avy eo mampiasa ny antso rafitra Clone bash dia mamorona dingana roa amin'ny zaza, ary ny dingana telo dia ho toy izao:

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

Aza adino fa clone clone ny dingana miaraka amin'ny antontan-taratasy rehetra descriptors, ka ho mitovy amin'ny ray aman-dreny sy ny zaza. Ny asan'ny fizotry ny ray aman-dreny miaraka amin'ny PID 15771 dia ny manara-maso ny fizotran'ny zaza, ka miandry valiny avy amin'ny ankizy fotsiny.

Noho izany, tsy mila fantsona, ary manidy ny rakitra descriptors 3 sy 4.

Ao amin'ny dingana bash ankizy voalohany miaraka amin'ny PID 9004, ny antson'ny rafitra dup2, dia manova ny isa STDOUT fichier descriptor isa 1 ho fichier descriptor manondro sodina, amin'ny tranga misy antsika dia isa 3. Noho izany, ny zavatra rehetra izay ny dingana voalohany amin'ny ankizy amin'ny PID 9004 soratan'ny STDOUT ho tonga dia hiafara amin'ny sodina buffer.

Ao amin'ny dingana faharoa amin'ny ankizy miaraka amin'ny PID 9005, bash dia mampiasa dup2 hanovana ny famaritana ny rakitra STDIN laharana 0. Ankehitriny dia hovakiana avy amin'ny sodina ny zavatra rehetra hovakian'ny bash faharoa miaraka amin'ny PID 9005.

Aorian'izany dia mihidy ao amin'ny fizotry ny ankizy ihany koa ny famaritana ny rakitra misy laharana 3 sy 4, satria tsy ampiasaina intsony izy ireo.

Iniana aho tsy miraharaha ny famaritana ny rakitra 255; ampiasaina amin'ny tanjona anatiny amin'ny alΓ lan'ny bash izy io ary hikatona ihany koa amin'ny fizotran'ny ankizy.

Manaraka, amin'ny dingana voalohany amin'ny ankizy miaraka amin'ny PID 9004, bash dia manomboka mampiasa antso an-tariby exec ny rakitra azo tanterahana izay nofaritanay tamin'ny baiko baiko, raha ny anay dia /usr/bin/cat.

Ao amin'ny dingana faharoa amin'ny zaza miaraka amin'ny PID 9005, ny bash dia mitantana ny executable faharoa nofaritanay, amin'ny tranga misy anay /usr/bin/sleep.

Ny antson'ny rafitra exec dia tsy manidy ny fisie raha tsy nosokafana tamin'ny saina O_CLOEXEC tamin'ny fotoana nanaovana ny antso misokatra. Amin'ny tranga misy antsika, aorian'ny fandefasana ireo rakitra azo tanterahana dia hovonjena avokoa ireo mpamoritra rakitra ankehitriny.

Jereo ao amin'ny 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

Araka ny hitanao dia mitovy ny isa tokana amin'ny fantsonay amin'ny dingana roa. Noho izany dia manana fifandraisana eo amin'ny dingana roa samy hafa miaraka amin'ny ray aman-dreny iray ihany isika.

Ho an'ireo izay tsy zatra amin'ny antso an-tariby ampiasain'ny bash, dia manoro hevitra mafy aho ny fampandehanana ny baiko amin'ny alΓ lan'ny strace ary mijery ny zava-mitranga ao anatiny, ohatra toy izao:

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

Andao hiverina amin'ny olan'ny tsy fahampian'ny habaka kapila ary manandrana mitahiry angona nefa tsy manomboka ny dingana. Andao hanoratra programa kely izay hanoratra 1 megabyte isan-tsegondra eo ho eo amin'ny kapila. Ankoatra izany, raha toa ka tsy afaka nanoratra angona tamin'ny kapila izahay noho ny antony iray, dia tsy hiraharaha izany fotsiny izahay ary hiezaka hanoratra ny angona indray ao anatin'ny segondra. Ao amin'ny ohatra ampiasaiko Python, afaka mampiasa fiteny fandaharana hafa ianao.

[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

Andeha hojerentsika ny programa ary hijery ny famaritana ny rakitra

[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

Araka ny hitanao dia manana ny famaritana rakitra mahazatra 3 izahay ary iray hafa nosokafanay. Andeha hojerentsika ny haben'ny rakitra:

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

Efa voasoratra ny angon-drakitra, miezaka manova ny fahazoan-dΓ lana amin'ny rakitra izahay:

[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

Hitanay fa mbola voasoratra ny angon-drakitra, na dia tsy mahazo alalana hanoratra amin'ny rakitra aza ny mpampiasa anay. Andeha isika hanala azy:

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

Aiza ny angon-drakitra voasoratra? Ary voasoratra daholo ve? Manamarina izahay:

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

Eny, mbola misy ny famariparitana ny rakitra ary azontsika atao toy ny rakitra taloha io mpamoritra rakitra io, afaka mamaky, mamafa ary mandika azy io isika.

Andeha hojerentsika ny haben'ny rakitra:

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

Ny haben'ny rakitra dia 19923457. Andao hanandrana hanadio ilay rakitra:

[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

Araka ny hitanao dia mitombo ihany ny haben'ny rakitra ary tsy mandeha ny vatantsika. Andeha hojerentsika ny antontan-taratasy momba ny antso an-tariby misokatra. Raha mampiasa ny saina O_APPEND isika rehefa manokatra rakitra, dia isaky ny manoratra, ny rafitra fandidiana dia manamarina ny haben'ny rakitra ary manoratra angona hatramin'ny faran'ny rakitra, ary manao izany amin'ny fomba atomika. Izany dia mamela kofehy na dingana maromaro manoratra amin'ny rakitra iray. Saingy ao amin'ny code misy anay dia tsy mampiasa ity saina ity izahay. Tsy afaka mahita haben'ny rakitra hafa isika ao amin'ny lsof aorian'ny vatan-kazo raha tsy manokatra ny rakitra ho an'ny fanoratana fanampiny, izay midika fa ao amin'ny kaody.

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

tsy maintsy mametraka

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

Fanamarinana amin'ny saina "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

ary miaraka amin'ny saina "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

Fandaharana dingana efa mandeha

Matetika ny mpandrindra, rehefa mamorona sy manandrana programa, dia mampiasa debugger (ohatra GDB) na ambaratonga samihafa amin'ny fidirana amin'ny fampiharana. Ny Linux dia manome fahafahana manoratra sy manova programa efa mandeha, ohatra, manova ny soatoavin'ny variables, mametraka teboka, sns., sns.

Miverina amin'ny fanontaniana tany am-boalohany momba ny tsy fahampian'ny habaka kapila hanoratana rakitra, andao hiezaka hanahaka ny olana.

Andao hamorona rakitra iray ho an'ny fizarazarantsika, izay hapetraka ho kapila misaraka:

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

Andao hamorona rafitra fichier:

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

Apetaho ny rafitra fichier:

[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

Mamorona lahatahiry miaraka amin'ny tompony izahay:

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

Andao hanokatra ny rakitra ho soratana ao amin'ny programantsika ihany:

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

fandefasana

[user@localhost ]$ python openforwrite.py 

Miandry segondra vitsy izahay

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

Noho izany, manana ny olana voalaza tany am-piandohan'ity lahatsoratra ity isika. Toerana malalaka 0, 100% mipetraka.

Tsaroantsika fa araka ny fepetran'ny asa, dia miezaka ny mirakitra angon-drakitra tena manan-danja izay tsy ho very. Ary miaraka amin'izay koa, mila manamboatra ny serivisy isika nefa tsy mamerina ny dingana.

Andeha atao hoe mbola manana habaka kapila isika, fa amin'ny fizarazarana hafa, ohatra ao amin'ny /home.

Andeha isika hiezaka ny "reprogram on the fly" ny code.

Andeha hojerentsika ny PID amin'ny fizotrantsika, izay nandany ny habaka kapila rehetra:

[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

Mifandraisa amin'ny dingana amin'ny alΓ lan'ny gdb

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

Andeha hojerentsika ny famaritana ny rakitra misokatra:

(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

Mijery ny fampahalalana momba ny famaritana ny rakitra laharana 3 izahay, izay mahaliana anay

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

Raha mitadidy ny atao hoe rafitra antsoina hoe Python (jereo etsy ambony ny toerana nihazakazaka strace ary nahita ny antso misokatra), rehefa manamboatra ny code mba hanokafana rakitra, dia manao toy izany koa ny tenantsika amin'ny anaran'ny dingana ataontsika, fa mila ny O_WRONLY|O_CREAT| Ny bits O_TRUNC dia manolo amin'ny sanda isa. Mba hanaovana izany, sokafy ny loharano kernel, ohatra eto ary jereo hoe saina inona no tompon'andraikitra amin'ny inona

#farito O_WRONLY 00000001
#define O_CREAT 00000100
#define O_TRUNC 00001000

Atambatra ho iray ny soatoavina rehetra, mahazo 00001101

Manao antso avy amin'ny gdb izahay

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

Noho izany dia nahazo famariparitana rakitra vaovao misy laharana 4 sy rakitra misokatra vaovao amin'ny fizarazarana hafa izahay, jereo:

(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

Tsaroantsika ny ohatra miaraka amin'ny pipe - ny fomba hanovan'ny bash ny famaritana ny rakitra, ary efa nianatra ny antson'ny rafitra dup2 izahay.

Miezaka ny manolo ny famaritana rakitra iray amin'ny iray hafa izahay

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

Hamarininay:

(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

Manakatona ny famaritana ny rakitra 4 izahay, satria tsy mila izany izahay:

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

Ary mivoaka ny 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

Fanamarinana ny rakitra vaovao:

[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

Araka ny hitanao, ny angon-drakitra dia voasoratra amin'ny rakitra vaovao, andao hojerentsika ny taloha:

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

Tsy misy angon-drakitra very, miasa ny fampiharana, soratana any amin'ny toerana vaovao ny logs.

Aleo hanasarotra kely ny asa

Alao sary an-tsaina fa zava-dehibe amintsika ny angon-drakitra, saingy tsy manana habaka kapila amin'ny fizarana rehetra isika ary tsy afaka mampifandray ny kapila.

Ny azontsika atao dia ny mamindra ny angonay any amin'ny toerana iray, ohatra amin'ny fantsona, ary avy eo mamindra ny angona avy amin'ny fantsona mankany amin'ny tambajotra amin'ny alΓ lan'ny programa sasany, ohatra ny netcat.
Afaka mamorona fantsona antsoina amin'ny baiko mkfifo isika. Hamorona rakitra pseudo eo amin'ny rafi-drakitra izany na dia tsy misy toerana malalaka aza.

Avereno indray ny fampiharana ary jereo:

[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

Tsy misy habaka kapila, fa nahavita namorona sodina antsoina hoe:

[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

Ankehitriny dia mila mametaka ny angon-drakitra rehetra miditra amin'ity sodina ity mankany amin'ny mpizara hafa amin'ny alΓ lan'ny tambajotra isika; io netcat io ihany no mety amin'izany.

Ao amin'ny server remote-server.example.com no atombotsika

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

Amin'ny mpizara misy olana dia manomboka amin'ny terminal misaraka izahay

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

Ankehitriny ny angon-drakitra rehetra izay miafara amin'ny sodina dia mandeha ho azy any amin'ny stdin amin'ny netcat, izay handefa izany amin'ny tambajotra amin'ny port 7777.

Ny hany tsy maintsy ataontsika dia ny manomboka manoratra ny angonay amin'ity fantsona nomena anarana ity.

Efa mandeha ny fampiharana:

[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

Amin'ireo saina rehetra, O_WRONLY ihany no ilaintsika satria efa misy ilay rakitra ary tsy mila mamafa azy

[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

Fanamarinana ny mpizara lavitra remote-server.example.com

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

Tonga ny angon-drakitra, jereo ny mpizara olana

[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

Voavonjy ny angona, voavaha ny olana.

Manararaotra miarahaba ireo mpiara-miasa amiko avy any Degiro aho.
Henoy ny podcast Radio-T.

Tsara daholo.

Amin'ny maha enti-mody, manoro hevitra anao aho hieritreritra izay ho ao amin'ny fizotry ny fichier descriptors cat and sleep raha toa ka manatanteraka izao baiko manaraka izao ianao:

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

Source: www.habr.com

Add a comment