I kekahi manawa, i ka wā o kahi ninaninau, ua nīnau ʻia iaʻu, he aha kāu e hana ai inā ʻike ʻoe i kahi lawelawe ʻaʻole e hana ma muli o ka pau ʻana o ka diski?
ʻOiaʻiʻo, ua pane wau e ʻike wau i ka mea i noho ʻia e kēia wahi a inā hiki, e hoʻomaʻemaʻe wau i kēlā wahi.
A laila, nīnau ka mea nīnau nīnau, pehea inā ʻaʻohe wahi kaʻawale ma ka pā, akā ʻaʻole ʻoe e ʻike i nā faila e lawe i nā wahi āpau?
I kēia mea au i ʻōlelo ai hiki iā ʻoe ke nānā mau i nā wehewehe faila wehe, no ka laʻana me ke kauoha lsof, a hoʻomaopopo i ka noi i lawe i nā wahi āpau i loaʻa, a laila hiki iā ʻoe ke hana e like me nā kūlana, e pili ana i ka pono o ka ʻikepili. .
Ua hoʻopau ka mea nīnau nīnau iaʻu ma ka ʻōlelo hope loa, me ka hoʻohui ʻana i kāna nīnau: "Inā ʻaʻole pono mākou i ka ʻikepili, he log debug wale nō, akā ʻaʻole hana ka noi no ka mea hiki ʻole ke kākau i kahi debug"?
"ʻAe," i pane aku ai au, "hiki iā mākou ke hoʻopau i ka debug i ka config noi a hoʻomaka hou."
Ua kūʻē ka mea nīnau nīnau: "ʻAʻole, ʻaʻole hiki iā mākou ke hoʻomaka hou i ka noi, aia nō mākou i nā ʻikepili koʻikoʻi i mālama ʻia i ka hoʻomanaʻo, a pili nā mea kūʻai aku koʻikoʻi i ka lawelawe ponoʻī, ʻaʻole hiki iā mākou ke koi e hoʻohui hou."
"ʻAe," wahi aʻu, "inā ʻaʻole hiki iā mākou ke hoʻomaka hou i ka noi a ʻaʻole koʻikoʻi ka ʻikepili iā mākou, a laila hiki iā mākou ke hoʻomaʻemaʻe i kēia faila wehe ma o ka file descriptor, ʻoiai inā ʻaʻole mākou e ʻike iā ia ma ke kauoha ls. ma ka ʻōnaehana faila."
Ua hauʻoli ka mea nīnau nīnau, akā ʻaʻole wau.
A laila, noʻonoʻo wau, no ke aha i ʻeli hohonu ʻole ai ka mea hoʻāʻo i koʻu ʻike? Akā, pehea inā he mea nui ka ʻikepili ma hope o nā mea a pau? He aha inā ʻaʻole hiki iā mākou ke hoʻomaka hou i kahi kaʻina hana, a kākau ke kaʻina i ka ʻōnaehana faila ma kahi ʻāpana ʻaʻohe wahi kaʻawale? He aha inā ʻaʻole hiki iā mākou ke nalowale ʻaʻole wale ka ʻikepili i kākau mua ʻia, akā ʻo ka ʻikepili hoʻi i kākau ai kēia kaʻina hana a hoʻāʻo paha e kākau?
Tuzik
I ka hoʻomaka ʻana o kaʻu ʻoihana, ua hoʻāʻo wau e hana i kahi noi liʻiliʻi e pono e mālama i ka ʻike mea hoʻohana. A laila noʻonoʻo wau, pehea wau e hoʻohālikelike ai i ka mea hoʻohana i kāna ʻikepili. No ka laʻana, loaʻa iaʻu ʻo Ivanov Ivan Ivanovich, a loaʻa iā ia kekahi mau ʻike, akā pehea wau e launa pū ai me lākou? Hiki iaʻu ke kuhikuhi pololei i ka ʻīlio i kapa ʻia ʻo "Tuzik" no kēia ʻIvana. Akā pehea inā e hoʻololi ʻo ia i kona inoa a ma kahi o Ivan e lilo, no ka laʻana, ʻo Olya? A laila e ʻike ʻia ʻaʻole e loaʻa hou kā mākou Olya Ivanovna Ivanova i kahi ʻīlio, a ʻo kā mākou Tuzik e pili ana i ka ʻIvana ʻole. ʻO kahi waihona i hāʻawi i kēlā me kēia mea hoʻohana i kahi ʻike kūʻokoʻa (ID) i kōkua i ka hoʻoponopono ʻana i kēia pilikia, a ua hoʻopaʻa ʻia koʻu Tuzik i kēia ID, ʻo ia hoʻi, he helu serial wale nō. No laila, ua loaʻa i ka mea nona ka ace ka helu ID 2, a i kekahi manawa aia ʻo Ivan ma lalo o kēia ID, a laila lilo ʻo Olya ma lalo o ka ID like. Ua hoʻoponopono ʻia ka pilikia o ke kanaka a me ka mahi holoholona.
Mea wehewehe waihona
ʻO ka pilikia o ka faila a me ka papahana e hana pū ana me kēia faila ua like ia me kā mākou ʻīlio a me ke kanaka. Inā paha ua wehe au i kahi faila i kapa ʻia ʻo ivan.txt a hoʻomaka wau e kākau i ka huaʻōlelo tuzik i loko, akā ua hoʻokō wale wau e kākau i ka leka mua "t" i loko o ka faila, a ua kapa hou ʻia kēia faila e kekahi, no ka laʻana, i olya.txt. Akā mau ka faila, a makemake au e hoʻopaʻa i kaʻu ace i loko. I kēlā me kēia manawa e wehe ʻia kahi faila e kahi kelepona ʻōnaehana
Ma Linux, wehe ka waihona libc i nā faila wehewehe 3 no kēlā me kēia noi holo (ka hana), helu ʻia 0,1,2. Hiki ke loaʻa ka ʻike hou aku ma nā loulou
- Ua kapa ʻia ʻo STDIN wehewehe faila 0 a pili pū me ka hoʻokomo noi
- Ua kapa ʻia ʻo STDOUT ka wehewehe faila 1 a hoʻohana ʻia e nā noi e hoʻopuka i ka ʻikepili, e like me nā kauoha paʻi
- Ua kapa ʻia ʻo STDERR ka wehewehe faila 2 a hoʻohana ʻia e nā noi e hoʻopuka i nā memo hewa.
Inā ma kāu polokalamu e wehe ʻoe i kekahi faila no ka heluhelu ʻana a i ʻole ke kākau ʻana, a laila e loaʻa iā ʻoe ka ID manuahi mua a ʻo ia ka helu 3.
Hiki ke nānā ʻia ka papa inoa o nā faila wehewehe no kekahi kaʻina hana inā ʻike ʻoe i kāna PID.
No ka laʻana, e wehe kākou i ka console bash a nānā i ka PID o kā mākou hana
[user@localhost ]$ echo $$
15771
I ka lua o ka console e holo kakou
[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
Hiki iā ʻoe ke haʻalele palekana i ka helu wehewehe faila 255 no nā kumu o kēia ʻatikala; ua wehe ʻia no kona pono e ka bash ponoʻī, ʻaʻole na ka waihona pili.
I kēia manawa, pili nā faila descriptor 3 me ka mea hoʻohana pseudo terminal
[user@localhost ]$ echo "hello world" > /proc/15771/fd/0
A ma ka console mua mākou e ʻike ai
[user@localhost ]$ hello world
Redirect a me ka paipu
Hiki iā ʻoe ke hoʻopau maʻalahi i kēia mau faila descriptor 3 i kekahi kaʻina hana, me ka bash, no ka laʻana ma o kahi paipu e hoʻopili ana i nā kaʻina ʻelua, ʻike.
[user@localhost ]$ cat /dev/zero | sleep 10000
Hiki iā ʻoe ke holo i kēia kauoha iā ʻoe iho me strace -f a ʻike i nā mea e hana nei i loko, akā e haʻi pōkole wau iā ʻoe.
ʻO kā mākou papa hana bash makua me PID 15771 e hoʻopau i kā mākou kauoha a hoʻomaopopo pono i ka nui o nā kauoha a mākou e makemake ai e holo, i kā mākou hihia aia ʻelua o lākou: ka pōpoki a me ka hiamoe. Ua ʻike ʻo Bash he pono ia e hana i ʻelua kaʻina keiki, a hoʻohui iā lākou i hoʻokahi paipu. I ka huina, pono ka bash i 2 kaʻina keiki a me hoʻokahi paipu.
Holo ʻo Bash i kahi kelepona ʻōnaehana ma mua o ka hana ʻana i nā kaʻina hana keiki
No ke kaʻina hana makua, me he mea lā aia he paipu, akā ʻaʻohe hana keiki i kēia manawa:
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
A laila e hoʻohana i ke kelepona ʻōnaehana
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
Mai poina i ka clone clone i ke kaʻina hana me nā mea wehewehe faila a pau, no laila e like lākou ma ke kaʻina hana makua a me nā keiki. ʻO ka hana o ke kaʻina hana makua me PID 15771 ka nānā ʻana i nā kaʻina keiki, no laila ke kali wale nei i ka pane mai nā keiki.
No laila, ʻaʻole pono ia i ka paipu, a pani ʻo ia i nā mea wehewehe faila helu 3 a me 4.
Ma ke kaʻina hana bash keiki mua me PID 9004, ke kelepona pūnaewele
Ma ke kaʻina hana lua o ke keiki me PID 9005, hoʻohana ka bash i ka dup2 e hoʻololi i ka wehewehe faila STDIN helu 0. I kēia manawa e heluhelu ʻia nā mea a pau a kā mākou lua bash me PID 9005 e heluhelu ʻia mai ka paipu.
Ma hope o kēia, ua pani ʻia nā mea wehewehe faila helu 3 a me 4 i nā kaʻina keiki, no ka mea ʻaʻole i hoʻohana hou ʻia.
Hoʻokaʻawale wau i ka faila descriptor 255; hoʻohana ʻia ia no ka hana kūloko e ka bash ponoʻī a pani ʻia hoʻi i nā kaʻina keiki.
A laila, i ke kaʻina hana keiki mua me PID 9004, hoʻomaka ka bash e hoʻohana i kahi kelepona ʻōnaehana
Ma ke kaʻina hana lua o ke keiki me PID 9005, holo ka bash i ka lua o ka hoʻokō a mākou i kuhikuhi ai, i kā mākou hihia /usr/bin/sleep.
ʻAʻole pani ka ʻōnaehana exec i nā lima waihona ke ʻole lākou i wehe ʻia me ka hae O_CLOEXEC i ka manawa i kāhea ʻia ai ke kelepona wehe. I kā mākou hihia, ma hope o ka hoʻokuʻu ʻana i nā faila hiki ke hoʻokō ʻia, e mālama ʻia nā mea wehewehe faila āpau.
E nānā i ka 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
E like me kāu e ʻike ai, ua like ka helu kūʻokoʻa o kā mākou paipu i nā kaʻina ʻelua. No laila, loaʻa iā mākou kahi pilina ma waena o nā kaʻina hana ʻelua me ka makua hoʻokahi.
No ka poʻe ʻike ʻole i ka ʻōnaehana kelepona i hoʻohana ʻia e bash, makemake nui wau e holo i nā kauoha ma o strace a ʻike i nā mea e hana nei i loko, e like me kēia:
strace -s 1024 -f bash -c "ls | grep hello"
E hoʻi kāua i kā mākou pilikia o ka pau ʻana o ka wahi disk a me ka hoʻāʻo e mālama i ka ʻikepili me ka ʻole e hoʻomaka hou i ke kaʻina hana. E kākau i kahi papahana liʻiliʻi e kākau ma kahi o 1 megabyte i kekona i ka disk. Eia kekahi, inā no kekahi kumu ʻaʻole hiki iā mākou ke kākau i ka ʻikepili i ka disk, e haʻalele wale mākou i kēia a hoʻāʻo e kākau hou i ka ʻikepili i kekona. Ma ka laʻana aʻu e hoʻohana nei i ka Python, hiki iā ʻoe ke hoʻohana i kekahi ʻōlelo papahana ʻē aʻe.
[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
E holo kāua i ka papahana a nānā i nā mea wehewehe faila
[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
E like me kāu e ʻike ai, loaʻa iā mākou kā mākou mau wehewehe faila maʻamau 3 a me kahi mea hou aʻe a mākou i wehe ai. E nānā kākou i ka nui o ka faila:
[user@localhost ]$ ls -lah 123.txt
-rw-rw-r-- 1 user user 117M Oct 7 16:30 123.txt
Ke kākau ʻia nei ka ʻikepili, hoʻāʻo mākou e hoʻololi i nā ʻae i ka faila:
[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
ʻIke mākou e kākau ʻia ana ka ʻikepili, ʻoiai ʻaʻole ʻae ʻia kā mākou mea hoʻohana e kākau i ka faila. E ho'āʻo kākou e wehe:
[user@localhost ]$ sudo rm 123.txt
[user@localhost ]$ ls 123.txt
ls: cannot access 123.txt: No such file or directory
Aia i hea ka ʻikepili i kākau ʻia? A ua kakauia anei lakou? Nānā mākou:
[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)
ʻAe, ke mau nei kā mākou wehewehe wehewehe faila a hiki iā mākou ke hana i kēia wehewehe wehewehe e like me kā mākou faila kahiko, hiki iā mākou ke heluhelu, holoi a kope.
E nānā kākou i ka nui o ka faila:
[user@localhost ]$ lsof | grep 123.txt
python 31083 user 3w REG 8,5 19923457 2621522 /home/user/123.txt
ʻO 19923457 ka nui o ka faila. E hoʻāʻo kākou e holoi i ka faila:
[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
E like me kāu e ʻike ai, ke hoʻonui wale nei ka nui o ka faila a ʻaʻole i hana kā mākou pahu. E nānā kākou i ka palapala kelepona pūnaewele
with open("123.txt", "w") as f:
pono mākou e kau
with open("123.txt", "a") as f:
Ke nānā nei me ka hae "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
a me ka hae "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
Hoʻolālā i kahi kaʻina hana e holo nei
Hoʻohana pinepine nā polokalamu polokalamu, i ka hana ʻana a me ka hoʻāʻo ʻana i nā polokalamu, hoʻohana i nā debuggers (no ka laʻana GDB) a i ʻole nā pae like ʻole o ke komo ʻana i ka noi. Hāʻawi ʻo Linux i ka hiki ke kākau maoli a hoʻololi i kahi papahana e holo nei, no ka laʻana, hoʻololi i nā waiwai o nā loli, hoʻonohonoho i kahi breakpoint, etc., etc.
Ke hoʻi nei i ka nīnau kumu e pili ana i ka lawa ʻole o ka wahi disk e kākau ai i kahi faila, e hoʻāʻo kākou e hoʻohālikelike i ka pilikia.
E hana mākou i faila no kā mākou ʻāpana, a mākou e kau ai ma ke ʻano he disk kaʻawale:
[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 ~]$
E hana kākou i ʻōnaehana faila:
[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 ~]$
E kau i ka ʻōnaehana waihona:
[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
Hana mākou i papa kuhikuhi me ko mākou mea nona:
[user@localhost ~]$ sudo mkdir /mnt/logs
[user@localhost ~]$ sudo chown user: /mnt/logs
E wehe mākou i ka faila no ke kākau ʻana ma kā mākou papahana wale nō:
with open("/mnt/logs/123.txt", "w") as f:
Hoʻolana
[user@localhost ]$ python openforwrite.py
Kali mākou i kekahi mau kekona
[user@localhost ~]$ df -h | grep mnt
/dev/loop0 8.7M 8.0M 0 100% /mnt
No laila, loaʻa iā mākou ka pilikia i wehewehe ʻia ma ka hoʻomaka o kēia ʻatikala. Wahi kaʻawale 0, 100% noho ʻia.
Hoʻomanaʻo mākou e like me nā kūlana o ka hana, ke hoʻāʻo nei mākou e hoʻopaʻa i nā ʻikepili koʻikoʻi loa i hiki ʻole ke nalowale. A i ka manawa like, pono mākou e hoʻoponopono i ka lawelawe me ka ʻole e hoʻomaka hou i ke kaʻina hana.
E ʻōlelo mākou he wahi disk kā mākou, akā ma kahi ʻāpana ʻokoʻa, no ka laʻana ma /home.
E ho'āʻo mākou e "hoʻoponopono hou i ka lele" i kā mākou code.
E nānā kākou i ka PID o kā mākou kaʻina hana, nāna i ʻai i nā wahi diski āpau:
[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
Hoʻohui i ke kaʻina hana ma o gdb
[user@localhost ~]$ gdb -p 10078
...
(gdb)
E nānā kākou i nā wehewehe wehewehe waihona:
(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
Ke nānā nei mākou i ka ʻike e pili ana i ka faila descriptor helu 3, kahi mea hoihoi iā mākou
(gdb) shell cat /proc/10078/fdinfo/3
pos: 8189952
flags: 0100001
mnt_id: 482
Ke hoʻomanaʻo nei i ka mea i kapa ʻia ʻo Python e hana ai (e ʻike i luna ma kahi a mākou i holo ai a loaʻa ka leo hamama), i ka wā e hoʻoponopono ai i kā mākou code e wehe i kahi faila, hana mākou iā mākou iho ma ka inoa o kā mākou kaʻina hana, akā pono mākou i ka O_WRONLY|O_CREAT| Hoʻololi nā ʻāpana O_TRUNC me kahi waiwai helu. No ka hana ʻana i kēia, wehe i nā kumu kernel, no ka laʻana
#define O_WRONLY 00000001
#define O_CREAT 00000100
#define O_TRUNC 00001000
Hoʻohui mākou i nā waiwai āpau i hoʻokahi, loaʻa iā mākou 00001101
Holo mākou i kā mākou kelepona mai gdb
(gdb) call open("/home/user/123.txt", 00001101,0666)
$1 = 4
No laila ua loaʻa iā mākou kahi wehewehe faila hou me ka helu 4 a me kahi faila wehe hou ma kahi ʻāpana ʻē aʻe, nānā mākou:
(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
Hoʻomanaʻo mākou i ka laʻana me ka paipu - pehea ka hoʻololi ʻana o bash i nā faila wehewehe, a ua aʻo mua mākou i ke kelepona ʻōnaehana dup2.
Ke hoʻāʻo nei mākou e hoʻololi i kahi mea wehewehe faila me kekahi
(gdb) call dup2(4,3)
$2 = 3
E nānā mākou:
(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
Hoʻopau mākou i ka wehewehe faila 4, no ka mea ʻaʻole pono mākou:
(gdb) call close (4)
$1 = 0
A haʻalele i ka 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
Ke nānā nei i ka faila hou:
[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
E like me kāu e ʻike ai, ua kākau ʻia ka ʻikepili i kahi faila hou, e nānā i ka mea kahiko:
[user@localhost ~]$ ls -lah /mnt/logs/123.txt
-rw-rw-r-- 1 user user 7.9M Oct 8 11:08 /mnt/logs/123.txt
ʻAʻohe ʻikepili i nalowale, hana ka noi, kākau ʻia nā lāʻau i kahi wahi hou.
E hoʻopili liʻiliʻi i ka hana
E noʻonoʻo kākou he mea koʻikoʻi ka ʻikepili iā mākou, akā ʻaʻohe o mākou wahi disk ma kekahi o nā ʻāpana a ʻaʻole hiki iā mākou ke hoʻohui i ka disk.
ʻO ka mea hiki iā mākou ke hoʻihoʻi hou i kā mākou ʻikepili i kekahi wahi, no ka laʻana i ka paipu, a ma ka huli hoʻihoʻi ʻana i ka ʻikepili mai ka paipu i ka pūnaewele ma o kekahi papahana, no ka laʻana netcat.
Hiki iā mākou ke hana i kahi paipu i kapa ʻia me ke kauoha mkfifo. E hana ia i kahi faila pseudo ma ka ʻōnaehana faila inā ʻaʻohe wahi kaʻawale ma luna.
E hoʻomaka hou i ka polokalamu a nānā:
[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
ʻAʻohe wahi disk, akā ua hana maikaʻi mākou i kahi paipu i kapa ʻia ma laila:
[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
I kēia manawa pono mākou e hoʻopili i nā ʻikepili a pau i komo i loko o kēia paipu i kahi kikowaena ʻē aʻe ma o ka pūnaewele; ua kūpono ka netcat like no kēia.
Hoʻomaka mākou ma ka server remote-server.example.com
[user@localhost ~]$ nc -l 7777 > 123.txt
Ma kā mākou kikowaena pilikia, hoʻomaka mākou i kahi kikowaena kaʻawale
[user@localhost ~]$ nc remote-server.example.com 7777 < /mnt/logs/megapipe
I kēia manawa, e hele koke nā ʻikepili a pau i ka paipu i stdin ma netcat, e hoʻouna iā ia i ka pūnaewele ma ke awa 7777.
ʻO kā mākou mea e hana ai, ʻo ka hoʻomaka ʻana e kākau i kā mākou ʻikepili i loko o kēia paipu i kapa ʻia.
Loaʻa iā mākou ka polokalamu e holo nei:
[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
ʻO nā hae a pau, pono mākou iā O_WRONLY no ka mea aia ka faila a ʻaʻole pono mākou e holoi.
[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
Ke nānā nei i ke kikowaena mamao remote-server.example.com
[user@localhost ~]$ ls -lah 123.txt
-rw-rw-r-- 1 user user 38M Oct 8 14:21 123.txt
Ke hele mai nei ka ʻikepili, nānā mākou i ka server pilikia
[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
Mālama ʻia ka ʻikepili, hoʻopau ʻia ka pilikia.
Lawe wau i kēia manawa e aloha aku i koʻu mau hoa hana mai Degiro.
E hoʻolohe i nā podcast Radio-T.
Maikaʻi.
Ma ke ʻano he haʻawina home, manaʻo wau e noʻonoʻo ʻoe i ka mea e hana ʻia i loko o ke kaʻina faila descriptors cat a hiamoe inā holo ʻoe i kēia kauoha:
[user@localhost ~]$ cat /dev/zero 2>/dev/null| sleep 10000
Source: www.habr.com