اڄ اسان شيرلڪ سسٽم جي ڪجهه جديد تازه ڪارين بابت ڳالهائڻ چاهيون ٿا [هي اسٽينفورڊ يونيورسٽي ۾ هڪ اعلي ڪارڪردگي ڪلستر آهي - تقريبن. trans.]، جيڪو خاص طور تي فائلن جي لسٽنگ کي تيز ڪري ٿو ڊائريڪٽرن ۾ وڏي تعداد ۾ داخل ٿيڻ سان.
باقاعده مضمونن جي برعڪس، هي هڪ اندروني رپورٽ کان وڌيڪ آهي ته ڪيئن اسان باقاعده شيرلڪ تي ڪم ڪريون ٿا ته جيئن ان کي اسان جي استعمال ڪندڙن لاءِ بهترين طريقي سان هلايو وڃي. اسان کي اميد آهي ته مستقبل ۾ هن قسم جا وڌيڪ مضمون شايع ٿيندا.
گھڻن فائلن کي لسٽ ڪرڻ وقت وٺندو آهي
اهو سڀ هڪ صارف کان ٽيڪنيڪل سپورٽ سوال سان شروع ٿيو. هن مسئلي کي ٻڌايو ته execution ls
ڊاريڪٽري ۾ 15 کان وڌيڪ داخلائن سان گڏ ڪجھ منٽ لڳن ٿا $SCRATCH
[ڊائريڪٽري عارضي فائلن لاءِ - تقريبن. لين].
ھڪڙي ڊاريڪٽري ۾ ھزارين فائلون عام طور تي فائل سسٽم تي بوجھ پيدا ڪن ٿيون ۽ يقيني طور تي سفارش نه ڪئي وئي آھي. صارف اهو ڄاڻيو ۽ تسليم ڪيو ته اهو سٺو نه هو، پر ذڪر ڪيو ويو ته لسٽنگ شيرلڪ جي ڀيٽ ۾ سندس ليپ ٽاپ تي 1000 ڀيرا تيز هئي. يقينن، هن اسان کي نقصان پهچايو. تنهنڪري اسان وڌيڪ اونهي ڏٺو.
ڇاڪاڻ ته LS سٺو لڳندو آهي
اسان ڏٺو ته اهو اصل ۾ ڇا ڪندو آهي ls
جڏهن هڪ ڊاريڪٽري لسٽ ڪري ٿي، ۽ اهو عمل ايترو ڊگهو ڇو وٺندو آهي. سڀ کان وڌيڪ جديد تقسيم تي ls
ڊفالٽ طور تي هلندو آهي ls --color=auto
، ڇاڪاڻ ته هرڪو رنگ پسند ڪندو آهي.
پر خوبصورت رنگ قيمت تي اچن ٿا: هر فائل لاءِ ls
مناسب رنگ چونڊڻ لاءِ فائل جي قسم، ان جي اجازتن، جھنڊن، وڌايل خاصيتن ۽ جھڙوڪ بابت معلومات حاصل ڪرڻ گھرجي.
مسئلي جو ھڪڙو سادو حل آھي ls ۾ رنگ کي مڪمل طور تي غير فعال ڪرڻ، پر تصور ڪريو صارفين کان ناراضگي. ڪنهن به حالت ۾ توهان کي رنگ ڪڍڻ نه گهرجي، اسان راکشس نه آهيون.
تنهنڪري اسان وڌيڪ اونهي ڏٺو. ls
ماحول جي تبديليءَ ذريعي رنگن جي داخلا LS_COLORS
، جيڪو مقرر ڪيو ويو آهي dircolors(1)
ترتيب واري فائل جي بنياد تي dir_colors(5)
. ها،
اچو ته هڪ ويجهي نظر وٺو
اهو طئي ڪرڻ لاءِ ته ڪهڙو رنگ اسڪيم سست ٿيڻ جو سبب بڻيو، اسان هڪ تجرباتي ماحول پيدا ڪيو:
$ mkdir $SCRATCH/dont
$ touch $SCRATCH/dont/{1..10000} # don't try this at home!
$ time ls --color=always $SCRATCH/dont | wc -l
10000
real 0m12.758s
user 0m0.104s
sys 0m0.699s
12,7 سيڪنڊن لاءِ 10 فائلون، تمام سٺو نه.
رستي ۾، اسان کي هڪ پرچم جي ضرورت آهي
--color=always
: جيتوڻيڪ هو ڦري ٿوls --color=auto
، پرls
اهو معلوم ٿئي ٿو جڏهن اهو ٽرمينل سان ڳنڍيل نه آهي (مثال طور پائپ ذريعي يا آئوٽ ريڊائريشن سان) ۽ رنگ کي بند ڪري ٿو جيڪڏهن سيٽ ڪيو وڃيauto
. هوشيار ماڻهو.
پوءِ ايترو وقت ڇا وٺي رهيو آهي؟ سان ڏٺوسين strace
:
$ strace -c ls --color=always $SCRATCH/dont | wc -l
10000
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
44.21 0.186617 19 10000 lstat
42.60 0.179807 18 10000 10000 getxattr
12.19 0.051438 5 10000 capget
0.71 0.003002 38 80 getdents
0.07 0.000305 10 30 mmap
0.05 0.000217 12 18 mprotect
0.03 0.000135 14 10 read
0.03 0.000123 11 11 open
0.02 0.000082 6 14 close
[...]
واهه: 10 ڪالون lstat()
، 10 ڪالون getxattr()
(جيڪو سڀ ناڪام ٿيو ڇو ته اسان جي ماحول ۾ خاصيتون نه آهن ls ڳولي رهيو آهي)، 10 ڪالون capget()
.
يقينن اهو بهتر ٿي سگهي ٿو.
صلاحيتون وصف؟ نه
مشوري جي پٺيان
$ eval $(dircolors -b | sed s/ca=[^:]*:/ca=:/)
$ time strace -c ls --color=always $SCRATCH/dont | wc -l
10000
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
98.95 0.423443 42 10000 lstat
0.78 0.003353 42 80 getdents
0.04 0.000188 10 18 mprotect
0.04 0.000181 6 30 mmap
0.02 0.000085 9 10 read
0.02 0.000084 28 3 mremap
0.02 0.000077 7 11 open
0.02 0.000066 5 14 close
[...]
------ ----------- ----------- --------- --------- ----------------
100.00 0.427920 10221 6 total
real 0m8.160s
user 0m0.115s
sys 0m0.961s
واه، 8 سيڪنڊن تائين تيز رفتار! اسان انهن سڀني قيمتي ڪالن کان نجات حاصل ڪئي getxattr()
، ۽ چئلينجز capget()
پڻ غائب ٿي ويو، عظيم.
پر اڃا تائين اهي اذيت وارا ڪال آهن lstat()
، جيتوڻيڪ…
توهان کي ڪيترا گلن جي ضرورت آهي؟
تنهن ڪري، اسان هڪ ويجهي نظر ورتو LS_COLORS
.
پهرين اسان صرف هن متغير کي بند ڪيو:
$ echo $LS_COLORS rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:su=37;41:sg=30;43:ca=:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.axa=00;36:*.oga=00;36:*.spx=00;36:*.xspf=00;36: $ unset LS_COLORS $ echo $LS_COLORS $ time ls --color=always $SCRATCH/dont | wc -l 10000 real 0m13.037s user 0m0.077s sys 0m1.092s
ڇا!؟! اڃا 13 سيڪنڊ؟
اهو ظاهر ٿئي ٿو ته جڏهن ماحول variable LS_COLORS
صرف ان جي عنصرن مان هڪ بيان نه ڪيو ويو آهي يا غائب آهي <type>=color:
، اهو ڊفالٽ طور ٺهيل ڊيٽابيس استعمال ڪري ٿو ۽ اڃا به رنگ استعمال ڪري ٿو. تنهن ڪري جيڪڏهن توهان چاهيو ٿا ته ڪنهن خاص فائل جي قسم لاءِ رنگ سازي کي بند ڪريو، توهان کي ان سان اوور رائڊ ڪرڻ جي ضرورت آهي <type>=:
يا <type> 00
فائل ۾ DIR_COLORS
.
گھڻي آزمائش ۽ غلطي کان پوء، اسان پنھنجي ڳولا کي ھن تائين محدود ڪيو:
EXEC 00
SETUID 00
SETGID 00
CAPABILITY 00
جنهن کي لکيو ويو آهي
LS_COLORS='ex=00:su=00:sg=00:ca=00:'
هن جو مطلب آهي: فائلن کي رنگ نه ڏيو خاصيت سان.
، نه ئي طرفان
اسان تيز ڪريون ٿا ls
۽ جيڪڏهن توهان انهن مان ڪنهن به چيڪ نه ڪندا آهيو، پوء سڏين ٿا lstat()
غائب، ۽ هاڻي اهو هڪ مڪمل طور تي مختلف معاملو آهي:
$ export LS_COLORS='ex=00:su=00:sg=00:ca=00:'
$ time strace -c ls --color=always $SCRATCH/dont | wc -l
10000
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
63.02 0.002865 36 80 getdents
8.10 0.000368 12 30 mmap
5.72 0.000260 14 18 mprotect
3.72 0.000169 15 11 open
2.79 0.000127 13 10 read
[...]
------ ----------- ----------- --------- --------- ----------------
100.00 0.004546 221 6 total
real 0m0.337s
user 0m0.032s
sys 0m0.029s
0,3 فائلن جي لسٽ تي 10 سيڪنڊ، هڪ رڪارڊ.
شيرلڪ کي ترتيب ڏيڻ
13 سيڪنڊن کان ڊفالٽ سيٽنگن سان 0,3 سيڪنڊن تائين معمولي ترتيبن سان LS_COLORS
مطلب ته غير موجودگيءَ جي ڪري 40 گنا تيز رفتار setuid
/ setgid
۽ رنگدار عملدار فائلون. ايترو وڏو نقصان ناهي.
يقينن، هي هاڻي هر صارف لاء شيرلڪ ۾ ترتيب ڏنل آهي.
پر جيڪڏهن توهان رنگين کي واپس ڪرڻ چاهيو ٿا، توهان صرف ڊفالٽ سيٽنگون ڏانهن واپس ڪري سگهو ٿا:
$ unset LS_COLORS
پر پوءِ ڊاريڪٽري تي تمام گهڻيون فائلون، پڪ سان پڪ ڪريو ته ان کي هلائڻ دوران ڪافي پيئجي ls
.
جو ذريعو: www.habr.com