オープンソースカンファレンスHokkaido2015 jus研究会札幌大会「なるほどUnixプロセス – RubyでUnixの基礎を学ぼう」の発表資料です。
https://www.ospn.jp/osc2015-do/modules/eguide/event.php?eid=11
動画: https://www.youtube.com/watch?v=3i55DKSIdSY
ͳΔ΄Ͳ6/*9ϓϩηεKoji Shimada@snoozer053VCZד6OJYך㛇燉㷕רֲ04$)0,,"*%0KVT灇瑔⠓劦䌽㣐⠓
View Slide
http://ruby-sapporo.org3VCZ4BQQPSP
http://www.jus.or.jp傈劤6/*9ِ٦ؠ⠓
http://tatsu-zine.com/books/naruhounix
ؔلٖ٦ذ؍ؚٝءأذي㹋鄲ׅ״ֲזفؚٗٓوぢֽדכזֻגծ6OJYֲתְֿה⢪גفؚٗٓىؚٝדֹ״ֲחזְ➂ぢֽךⱁדׅկջזקו6OJYفٗإأռⰻ㺁稱➜l
http://razokulover.hateblo.jp/entry/2014/11/12/084645
http://yuuki.hatenablog.com/entry/2015-webserver-architecture
3VCZד㷕ע
http://tatsu-zine.com/books/naruhounix3VCZכ6OJYך㶨⣘דׅկ 殛3VCZך֮ײהֿכ6OJYךءأذي؝٦ٕװ俑⻉٥䙼䟝僥׃גְתׅկ
ͳΔ΄Ͳ6/*9ϓϩηεKoji ShimadaRubySapporo3VCZד6OJYך㛇燉㷕רֲ04$)0,,"*%0KVT灇瑔⠓劦䌽㣐⠓
فٗإأג♧⡤וזך
فٗإأהכ˖ 㹋遤⚥ךفؚٗٓيך㹋⡤˖ ׅץגך؝٦سכفٗإأ♳ד㹋遤ׁ% ps -xPID TTY TIME CMD326 ?? 0:20.78 /usr/libexec/UserEventAgent (Aqua)328 ?? 6:57.66 /usr/sbin/distnoted agent329 ?? 0:08.13 /usr/sbin/universalaccessd launchd -s330 ?? 0:44.20 /usr/sbin/cfprefsd agent333 ?? 1:50.07 /System/Library/CoreServices/Dock.app/Contents/MacOS/Dock335 ?? 11:16.33 /System/Library/CoreServices/SystemUIServer.app/Contents/MacOS/…336 ?? 4:03.26 /System/Library/CoreServices/Finder.app/Contents/MacOS/Finder...ֿך遤遤ָ植㖈㹋遤⚥ךفٗإأ痥畍չ劤剅ך䩛䒷ֹպ
3VCZ⢪ג⡤꿀% irb>㹋遤⚥ךJSCךفٗإأ然钠דֹאךة٦ىشٕדJSC饯⹛׃גֲֶֹאךة٦ىشٕדQT؝وٝس㹋遤ׅ% psPID TTY TIME CMD35558 ttys000 0:00.13 -zsh38910 ttys000 0:00.53 irb38956 ttys001 0:00.15 -zsh
فٗإأחכ*%ָ֮˖ ぐفٗإأכ♧䠐ז*% فٗإأ*%䭯א˖ 3VCZדכ1SPDFTTQJEד然钠דֹ% irb> Process.pid=> 38910% psPID TTY TIME CMD35558 ttys000 0:00.13 -zsh38910 ttys000 0:00.53 irb38956 ttys001 0:00.15 -zshQT؝وٝسדכ1*%דךفٗإأ*%然钠דֹ痥畍չفٗإأחכ*%ָ֮պ
垥彊أزٔ٦ي˖ فٗإأחכ垥彊أزٔ٦يָֻאְגֻ˖ 垥彊Ⰵ⸂ծ垥彊⳿⸂ծ垥彊ؒٓ٦⳿⸂ךא˖ ךⰅ⳿⸂כ鸐䌢ة٦ىشٕה籬ָגְفٗإأλʔϛφϧ垥彊Ⰵ⸂垥彊⳿⸂ؗ٦ن٦سر؍أفٖ؎痥畍չفٗإأחכؿ؋؎ٕر؍أؙٔفةָ֮պ
> input = STDIN.getsfoo=> “foo¥n”> STDOUT.puts “bar”bar=> nil3VCZ⢪ג⡤꿀ס⢪גְQVUTװHFUTծ״⿑㺘ח邌植ׅה˘3VCZדכ45%*/ծ45%065ծ45%&33ד撑דֹ> STDIN=> #>> STOUT=> #>
ؿ؋؎ٕر؍أؙٔفة˖ 垥彊Ⰵ⳿⸂ؿ؋؎ٕⰅ⳿⸂ծ04ַכׅץגずׄ״ֲזךٔا٦أה׃ג䪔˖ فٗإأָ籬ָגְٔا٦أכչؿ؋؎ٕر؍أؙٔفةպהְֲ♧䠐ז侭侧⦼ה׃ג邌植ׁ痥畍չفٗإأחכؿ؋؎ٕر؍أؙٔفةָ֮պؿ؋؎ٕؗ٦ن٦سλʔϛφϧفٗإأر؍أفٖ؎GEGEGE
3VCZדכMFOPדؿ؋؎ٕر؍أؙٔفة然钠דֹ>> STDIN.fileno=> 0>> STDOUT.fileno=> 1>> STDERR.fileno=> 2>> file = File.open(“a.txt”, “w”)=> #>> file.fileno=> 9㢩鿇ؿ؋؎ٕפךⰅ⳿⸂ずׄ״ֲח盖椚ׁגְֿהַָ3VCZ⢪ג⡤꿀
ٔت؎ؙٖءّٝ垥彊Ⰵ⳿⸂⯓ؿ؋؎ٕח➰ֽ剏ִ$ wc -l < in.txtⰅ⸂ٔت؎ؙٖءّٝ⳿⸂ٔت؎ؙٖءّٝ$ ps > out.txtず儗ח遤ֲ$ wc -l < in.txt > out.txt
file = File.open(“out.txt”, “w”)STDOUT.reopen(file)puts “ඪ४ग़ྗઌ͕มΘ͍ͬͯΔͣ”3VCZ⢪ג⡤꿀SFPQFO⢪ֲֿהדⰅ⳿⸂⯓➰ֽ剏ִSFEJSFDUJPO@FYBNQMFSC$ ruby redirection_example.rb$ cat out.txtඪ४ग़ྗઌ͕มΘ͍ͬͯΔͣ⹛⡲然钠
ֿֿתדךתה
فؚٗٓيכفٗإأה׃ג㹋遤ׁ$ lsة٦ىشַٕ؝وٝس㹋遤ׅה˘
فؚٗٓيכفٗإأה׃ג㹋遤ׁMT㹋遤ׅفٗإأ$ lsة٦ىشַٕ؝وٝس㹋遤ׅה˘
فٗإأחכ*%ָ֮MT㹋遤ׅفٗإأ$ lsϓϩηε*%
فٗإأכ垥彊أزٔ٦ي䭯אفٗإأ$ lsة٦ىشٕر؍أفٖ؎ؗ٦ن٦س垥彊Ⰵ⸂垥彊⳿⸂
垥彊أزٔ٦يؿ؋؎ٕׅץגָٔا٦أה׃ג盖椚ׁ$ lsة٦ىشٕ垥彊Ⰵ⸂垥彊⳿⸂ؿ؋؎ٕؿ؋؎ٕ⳿⸂ؗ٦ن٦سر؍أفٖ؎
ٔا٦أכؿ؋؎ٕر؍أؙٔفةה׃ג盖椚ׁ$ lsة٦ىشٕ殢湡ךٔا٦أ殢湡ךٔا٦أؿ؋؎ٕ殢湡ךٔا٦أؗ٦ن٦سر؍أفٖ؎
فٗإأחכ鋵ְָ˖ ׅץגךفٗإأחכ鋵הזفٗإأָ㶷㖈ׅ˖ 3VCZדכ1SPDFTTQQJEד然钠דֹ% irb> Process.ppid=> 38910% ps -lUID PID PPID F CPU PRI NI SZ RSS WCHAN S ADDR TTY TIME CMD501 35558 35557 4006 0 31 0 2481048 3920 - S 0 ttys000 0:00.13 -zsh501 38910 35558 4046 0 31 0 2497224 12768 - S+ 0 ttys000 0:00.55 irb501 38956 38955 4006 0 31 0 2491288 4184 - S 0 ttys001 0:00.15 -zshQT؝وٝسדכ11*%ד鋵فٗإأך*%然钠דֹJSCفٗإأך鋵فٗإأכ[TIفٗإأדֿ֮הַָ痥畍չفٗإأחכ鋵ְָպ
荈ⴓָ鋵חזGPSLֿׅהדծ荈ⴓָ鋵חזֿהָדֹputs “ࣗ: PID(#{Process.pid}) PPID(#{Process.pid})”pid = fork doputs “ ࢠ: PID(#{Process.pid}) PPID(#{Process.pid})”endProcess.waitpid(pid)GPSL@FYBNQMFSC$ ruby fork_example.rbࣗ: PID(45261) PPID(35558)ɹࢠ: PID(45306) PPID(45261)⹛⡲然钠痥畍չفٗإأכ㶨فٗإأ⡲պ
荈ⴓָ鋵חזGPSLֿׅהדծ荈ⴓָ鋵חזֿהָדֹputs “ࣗ: PID(#{Process.pid}) PPID(#{Process.pid})”pid = fork doputs “ ࢠ: PID(#{Process.pid}) PPID(#{Process.pid})”endProcess.waitpid(pid)GPSL@FYBNQMFSCSVCZفؚٗٓي㹋遤⚥ךفٗإأSVCZفؚٗٓي㹋遤⚥ךفٗإأך醱醡SVCZفؚٗٓي㹋遤⚥ךفٗإأך醱醡GPSLָㄎן⳿ׁה荈ⴓ؝ؾ٦׃ג倜׃ְفٗإأָ⡲
荈ⴓָ鋵חזGPSLֿׅהדծ荈ⴓָ鋵חזֿהָדֹputs “ࣗ: PID(#{Process.pid}) PPID(#{Process.pid})”pid = fork doputs “ ࢠ: PID(#{Process.pid}) PPID(#{Process.pid})”endProcess.waitpid(pid)GPSL@FYBNQMFSCSVCZفؚٗٓي㹋遤⚥ךفٗإأSVCZفؚٗٓي㹋遤⚥ךفٗإأך醱醡欰䧭ׁفٗإأכـٗحؙך⚥ֽ㹋遤ׅ⯋ךفٗإأכך䖓㹋遤׃גְֻ
㶨⣘חⴽך麣遤ַׇFYFD⢪ֲהⴽךفؚٗٓي㹋遤ׅفٗإأח㢌魦ׇֿׁהָדֹpid = fork doexec “ps”, “-l”puts “͜͜ͷॲཧ͏ಈ͔ͳ͍”endProcess.waitpid(pid)puts “psίϚϯυ͕࣮ߦ͞Εͨͣ”GPSL@FYFD@FYBNQMFSC$ ruby fork_exec_example.rbfork_exec_example.rb:2: warning: Insecure world writable dir /usr/local/Cellar in PATH, mode 040777UID PID PPID F CPU PRI NI SZ RSS WCHAN S ADDR TTY TIME CMD501 22184 22183 4006 0 31 0 2499544 6856 - S 0 ttys000 0:00.35 -zsh501 25237 22184 4046 0 31 0 2447816 7080 - S+ 0 ttys000 0:00.05 ruby-w0 fork_exec_example.rbpwdίϚϯυ͕࣮ߦ͞Εͨͣ⹛⡲然钠痥畍չ畭劣فٗإأ⡲պ
فٗإأכفٗإأַ欰䧭ׁ$ lsة٦ىشַٕ؝وٝس㹋遤ׅהכ˘
ءٕؑ㹋遤׃גְفٗإأ$ lsفٗإأכفٗإأַ欰䧭ׁⰅ⸂ׁⰻ㺁ءٕؑفٗإأָ鍑ꅸ׃ג垥彊⳿⸂垥彊Ⰵ⸂MT垥彊⳿⸂
ءٕؑ㹋遤׃גְفٗإأ$ lsفٗإأכفٗإأַ欰䧭ׁGPSL׃גفٗإأ醱醡׃垥彊Ⰵ⸂垥彊⳿⸂ءٕؑ㹋遤׃גְفٗإأ垥彊Ⰵ⸂垥彊⳿⸂
ءٕؑ㹋遤׃גְفٗإأ$ lsفٗإأכفٗإأַ欰䧭ׁFYFD׃ג؝وٝس㹋遤ׅفٗإأח㢌魦ׇׁ垥彊Ⰵ⸂垥彊⳿⸂MT㹋遤׃גְفٗإأ垥彊Ⰵ⸂垥彊⳿⸂
ءٕؑ㹋遤׃גְفٗإأ$ lsفٗإأכفٗإأַ欰䧭ׁFYFD׃ג؝وٝس㹋遤ׅفٗإأח㢌魦ׇׁ垥彊Ⰵ⸂垥彊⳿⸂MT㹋遤׃גְفٗإأ垥彊Ⰵ⸂垥彊⳿⸂穠卓⳿⸂
ءٕؑ㹋遤׃גְفٗإأ$ lsفٗإأכفٗإأַ欰䧭ׁⳢ椚穄ִה㶨فٗإأכ穄✪ׅ垥彊Ⰵ⸂垥彊⳿⸂
ע籬ֺさׇ
ػ؎ف
ػ؎ف؝وٝسך穠卓ⴽך؝وٝسךⰅ⸂חׅ$ ps -x | wc -lQT؝وٝسך穠卓ך遤侧XD؝وٝسדؕؐٝزָֿׅ6/*9ךㆸ㷕ד֮կ♧אךֿה遤ְծתֲתֻװفؚٗٓي剅ֽկ⼿锃׃ג⹛ֻفؚٗٓي剅ֽկ.%وؗٗ؎l
ػ؎ف؝وٝسך穠卓ⴽך؝وٝسךⰅ⸂חׅוֲװג˖ אך؝وٝسך垥彊⳿⸂ה垥彊Ⰵ⸂אז־˖ QJQFءأذي؝٦ٕ⢪ג㹋植ׅ˖ 3VCZדכ*0QJQF⢪גずֿׄהָדֹ痥畍չفٗإأכ鸐⥋דֹպ
*0QJQFאַג> write_io.puts “foo”=> nil> write_io.puts “bar”=> nil> read_io.gets=> “foo¥n”> read_io.gets=> “bar¥n”> read_io, write_io = IO.pipe=> [#>IO:fd 9>, #ػ؎ف⡲䧭ׅػ؎فח剅ֹ鴥ػ؎ف铣⳿ׅ
*0QJQFאַג>IO.pipe do |read_io, write_io|> write_io.puts “foo”> write_io.puts “bar”> p read_io.gets> p read_io.gets>end“foo¥n”“bar¥n”ـٗحؙ晛
QJQF⢪גְהֹך؎ً٦آفٗإأXSJUF@JPSFBE@JPػ؎فˑGPPdO˒ˑCBSdO˒
ֿז괏ח⢪ֲֿהדػ؎ف㹋植דֹفٗإأ"λʔϛφϧ垥彊Ⰵ⸂垥彊⳿⸂فٗإأ#垥彊Ⰵ⸂垥彊⳿⸂ػ؎ف
3VCZ⢪ג⡤꿀ׅ
3VCZ⢪ג⡤꿀IO.pipe do |read_io, write_io|fork doSTDOUT.reopen(write_io)exec ‘ps’, ‘-x’endfork doSTDIN.reopen(read_io)exec ‘wc’, ‘-l’endendProcess.waitallQJQF@FYBNQMFSC⹛⡲然钠$ ruby pipe_example.rb
תה
➙傈װֿה˖ فؚٗٓيכفٗإأה׃ג㹋遤ׁ˖ فٗإأכ*%䭯א˖ فٗإأכ垥彊أزٔ٦يח籬ָגְ˖ ٔا٦أכؿ؋؎ٕر؍أؙٔفة䭯א˖ 鋵فٗإأה㶨فٗإأחאְג˖ GPSLFYFDדⴽךفؚٗٓي㹋遤ׅ˖ فٗإأず㡦ךⰅ⳿⸂ػ؎فד籬־ג
➙傈װזַֿה˖ 橆㞮㢌侧ךֿה˖ ؝وٝسٓ؎ٝ䒷侧ךֿה˖ فٗإأך鸐⥋חאְגך鑫稢˖ ءؚشٕךֿה˖ ر٦ٌٝفٗإأךֿה˖ 植㹋⚅歲דך⢽
http://www.garbagecollect.jp/~usa/d/201304c.htmlջזקו6OJYفٗإأռד㷕ע8JOEPXT晛3VCZך㛇燉
Comming Soon…