Fabric: ThreadingGroup ์‹คํ–‰์— ์ ˆ์ „ ๋ชจ๋“œ๊ฐ€ ํฌํ•จ๋œ ๊ฒฝ์šฐ ๋กœ์ปฌ ํ„ฐ๋ฏธ๋„ stdin์ด ๋ถ„๋ฆฌ๋จ

์— ๋งŒ๋“  2018๋…„ 06์›” 25์ผ  ยท  22์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: fabric/fabric

์‰˜ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์Šค๋ ˆ๋”ฉ ๊ทธ๋ฃน์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. sleep ๋ฅผ ํฌํ•จํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•œ ํ›„ ๋กœ์ปฌ ํ„ฐ๋ฏธ๋„์€ stdin ๋ถ„๋ฆฌ๋œ ์ƒํƒœ๋กœ ๋‚จ๊ณ (ํ‚ค ์ž…๋ ฅ์€ ๋ช…๋ น์ค„์— ํ‘œ์‹œ๋˜์ง€ ์•Š์Œ) ํ„ฐ๋ฏธ๋„์„ ์žฌ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์„ ๊ฝค ์—ฌ๋Ÿฌ ๋ฒˆ ์‹œ๋„ํ–ˆ๊ณ  ThreadingGroups์—์„œ๋งŒ ๋ฐœ์ƒํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค(SerialGroups๋Š” ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค). sleep ๋ช…๋ น์€ ํ•œ ์ค„(์ฒซ ๋ฒˆ์งธ ๋ช…๋ น, ์ค‘๊ฐ„, ๋งˆ์ง€๋ง‰)์˜ ์•„๋ฌด ๊ณณ์—๋‚˜ ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์„ธ๋ฏธ์ฝœ๋ก ์ด๋‚˜ ์ด์ค‘ ์•ฐํผ์ƒŒ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•œ ์ค„์—์„œ ๊ฒฐํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๋ช…๋ น์ด ์˜ˆ์ƒ๋Œ€๋กœ ์‹คํ–‰๋˜์ง€๋งŒ ํ„ฐ๋ฏธ๋„์€ ์ž˜๋ชป๋œ ์ƒํƒœ๋กœ ๋‚จ์•„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ƒํ•˜๊ฒŒ๋„ ์ด์ „ ์‹คํ–‰์ด ์žกํžˆ์ง€ ์•Š์€ ์˜ˆ์™ธ๋กœ ์ข…๋ฃŒ๋œ ๊ฒฝ์šฐ ํ„ฐ๋ฏธ๋„์€ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์žฌํ˜„ํ•˜๋ ค๋ฉด:

from fabric import ThreadingGroup as Group

# raise ValueError()
remotes = Group("host1.example.com", "host2.example.com")
result = remotes.run("echo 1; sleep 1; echo 2")

์œ„์˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ข…๋ฃŒ ํ›„ ๋ช…๋ น์ค„์— ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค. ์ถœ๋ ฅ์ด ํ‘œ์‹œ๋˜์ง€ ์•Š์œผ๋ฉด <ctrl>+c ๋ฅผ ์ž…๋ ฅํ•˜๊ณ  reset<enter> ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌํ›„ ์˜ˆ์™ธ ๋™์ž‘์„ ๋ณด๋ ค๋ฉด raise ํ–‰์˜ ์ฃผ์„ ์ฒ˜๋ฆฌ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ํ–‰์— ์ฃผ์„์„ ๋‹ฌ๊ณ  ๋‘ ๋ฒˆ ๋” ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ์„ฑ๊ณต์ ์ธ ์‹คํ–‰์€ ํ„ฐ๋ฏธ๋„์„ ์–‘ํ˜ธํ•œ ์ƒํƒœ๋กœ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ๋Š” stdin ๋ถ„๋ฆฌ๋œ ์ƒํƒœ๋กœ ๋‘ก๋‹ˆ๋‹ค.

ํ…Œ์ŠคํŠธ์—์„œ sleep ์—์„œ ์ด ๋ฌธ์ œ๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์ง€๋งŒ ๋‹ค๋ฅธ ๋ช…๋ น์ด ๋™์ผํ•œ ํšจ๊ณผ๋ฅผ ๋‚ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋ญ”๊ฐ€๋ฅผ ์ž˜๋ชปํ•˜๊ณ  ์žˆ์„ ๊ฐ€๋Šฅ์„ฑ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์‚ฌ๊ณผ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

๋‚ด ์„ค์ •:
ํŒŒ์ด์ฌ 3.6.4
ํŒจ๋ธŒ๋ฆญ 2.1.3
OSX 10.13.5, Ubuntu 14.04์— ์—ฐ๊ฒฐ

Bug Needs investigation

๋ชจ๋“  22 ๋Œ“๊ธ€

์žฌํ˜„ ๊ฐ€๋Šฅํ•œ ๋‘ ๋ฒˆ์งธ ๋ฌธ์ œ ์‚ฌ๋ก€๋กœ #1814๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

์ด๊ฒƒ์€ ๋‚˜์—๊ฒŒ ํ•ฉ๋ฒ•์  ์ธ ๋ฒ„๊ทธ์ฒ˜๋Ÿผ ๋“ค๋ฆฌ๊ณ  ๋ฌด์—‡์ด ์›์ธ์ธ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ํ„ฐ๋ฏธ๋„ ํŒŒ์ดํ”„๊ฐ€ ํ•œ ๋ฒˆ์— ์—ฌ๋Ÿฌ ํ•˜์œ„ ํ”„๋กœ์„ธ์Šค์— ์—ฐ๊ฒฐ๋˜๋Š” ์ผ๋ฐ˜์ ์ธ Unix ๋ฌธ์ œ์ด๊ฑฐ๋‚˜ (ํŠนํžˆ #1814์˜ ์˜ˆ์— ๋”ฐ๋ผ) ํŒŒ์ดํ”„ ์ƒํƒœ ์ฃผ๋ณ€์˜ ๊ฒฝ์Ÿ ์กฐ๊ฑด ๋“ฑ์˜ ๋ƒ„์ƒˆ๊ฐ€ ๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์›์ธ/ํ•ด๊ฒฐ์ฑ…์„ ์žฌํ˜„ํ•˜๊ณ  ํ˜ผ๋ž€์Šค๋Ÿฝ๊ฒŒ ๋งŒ๋“ค ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ ์ด๊ฒƒ์€ ์•„๋งˆ๋„ Invoke ์ˆ˜์ค€์—์„œ ์ˆ˜์ •ํ•ด์•ผ ํ•˜๊ณ  ์ˆœ์ „ํžˆ ํ•ด๋‹น ๋„๋ฉ”์ธ์— ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฑฐ๊ธฐ์—์„œ๋„ ์ผ์–ด๋‚˜์•ผ ํ•จ). ์ด ๊ฒฝ์šฐ ์ด๋ฅผ ํ‹ฐ์ผ“์œผ๋กœ ์˜ฎ๊ธฐ๊ณ  Fabric "์ˆ˜์ •"์€ ์ˆ˜์ • ์‚ฌํ•ญ์ด ๋ฆด๋ฆฌ์Šค๋˜๋ฉด Invoke๋ฅผ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” Ubuntu 16.04.2์— ์—ฐ๊ฒฐ๋˜์–ด์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

#1829์˜ ๋™์ผํ•œ ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋˜ ๋‹ค๋ฅธ ๋ณด๊ณ ์„œ. ์ด๊ฒƒ์€ ๋‚ด ๋‹ค์Œ ๋ฒ„๊ทธ ์ˆ˜์ • ์ด์ •ํ‘œ์— ์žˆ์œผ๋ฉฐ ๋‹ค์Œ OSS ๋‚ (์›”)์— ์ง‘์ค‘ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฐฉ๊ธˆ ์ด๊ฒƒ์„ ์žฌํ˜„ํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ์ง€๋งŒ(2.0 ๋ถ„๊ธฐ, Python 3.6.4, macOS 10.12) ๋ถˆํ–‰ํžˆ๋„ ํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ๋จผ์ € ์ด์ค‘ ๋กœ์ปฌ ํ˜ธ์ŠคํŠธ๋ฅผ ์‹œ๋„ํ•œ ๋‹ค์Œ ๋‘ ๊ฐœ์˜ ๊ฐœ๋ณ„ ์›๊ฒฉ ํด๋ผ์šฐ๋“œ ์ธ์Šคํ„ด์Šค๋ฅผ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค. ์–ด๋Š ์ชฝ์ด๋“  ์ฃผ์‚ฌ์œ„๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋‚ด ํ„ฐ๋ฏธ๋„์€ ๋‚˜์ค‘์— ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.

๋„์›€์ด ๋˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•˜์—ฌ Linux ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์กฐ๊ธˆ ์‹œ๋„ํ•ด ๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ OP๊ฐ€ macOS์—๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฐจ์ด๊ฐ€ ์žˆ์„์ง€ ํ™•์‹ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ฃจํ”„์—์„œ ์‹คํ–‰ํ•˜์—ฌ ๊ฐ€๋” ๋ฐ˜๋ณต๋˜๋Š”์ง€ ํ™•์ธํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ 2.1์—์„œ ๊ทธ๊ฒƒ์„ ์–ด๋–ป๊ฒŒ๋“  ๋„์ž…ํ•œ ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•˜์—ฌ 2.1์—์„œ๋„ ๊ทธ๊ฒƒ์„ ์‹œ๋„ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@jensenak @nicktimko ์ด๊ฑฐ 100% ์žฌํ˜„ํ•˜์‹œ๋‚˜์š”? 50%? 5%?

@bitprophet 2.1.3์—์„œ๋Š” ์‹ค์ œ ์›Œํฌํ”Œ๋กœ์—์„œ ์ƒ๋‹นํžˆ ์ž์ฃผ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค(>80%, ์ €๋„ 2

@bitprophet ์ด๊ฒƒ์€ ์ €์—๊ฒŒ 100% ์‹œ๊ฐ„์ด์—ˆ์Šต๋‹ˆ๋‹ค. ํ™•์‹คํžˆ ํ•˜๊ธฐ ์œ„ํ•ด ํŒจ๋ธŒ๋ฆญ๋งŒ ์„ค์น˜๋œ ์ƒˆ๋กœ์šด virtualenv๋ฅผ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. 2.0, 2.1 ๋ฐ 2.2๋ฅผ ํ…Œ์ŠคํŠธํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋ถ™์—ฌ ๋„ฃ์€ ์˜ˆ์ œ ์ฝ”๋“œ๋Š” ๋งค๋ฒˆ ์„ค๋ช…๋œ ๋™์ž‘์„ ์ƒ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ํ…Œ์ŠคํŠธ์—์„œ Ubuntu 14.04 ๋ฆฌ๋ชจ์ปจ์— ์—ฐ๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ๋ฒ„์ „์˜ OSX(10.13)๋ฅผ ์‚ฌ์šฉ ์ค‘์ž…๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ๊ทธ๊ฒƒ์ด ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๊นŒ? @nicktimko ๋Š” OSX์— ์ „ํ˜€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ๋ฒ„์ „์ด ๋ฌธ์ œ์ธ ๊ฒฝ์šฐ ๋‚ด virtualenv์—์„œ pip freeze ๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

asn1crypto==0.24.0
bcrypt==3.1.4
cffi==1.11.5
cryptography==2.3
fabric==2.2.1
idna==2.7
invoke==1.1.0
paramiko==2.4.1
pyasn1==0.4.4
pycparser==2.18
PyNaCl==1.2.1
six==1.11.0

์ด ๋ชจ๋“  ๊ฒƒ์ด Fabric 2.2์˜ ์ข…์†์„ฑ์œผ๋กœ ์„ค์น˜๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ท€ํ•˜์˜ ๋ฒ„์ „์ด ๋น„์Šทํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋ฉ๋‹ˆ๋‹ค.

์ œ๊ฐ€ ๋„์šธ ์ˆ˜ ์žˆ๋Š” ์ผ์ด ๋” ์žˆ๋‹ค๋ฉด ๊ธฐ๊บผ์ด ๋„์™€๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๊ณณ์„ ๋ด์•ผํ• ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

์–ด๋–ค ์ปค๋ฐ‹์œผ๋กœ ํ…Œ์ŠคํŠธํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ? ์ตœ๊ทผ์— ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ๋Š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์œ„์˜ ๋™๊ฒฐ๋กœ ์‹œ๋„ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋˜ ๋‹ค๋ฅธ ๋™๊ฒฐ๋œ reqs.txt ์ œ๊ณตํ•  ์ˆ˜๋„ ์žˆ๊ณ  ๊ทธ๊ฒƒ์ด ์ž‘๋™ํ•˜๋Š”์ง€/์ €์—๊ฒŒ ๋งž์ง€ ์•Š๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@nicktimko @jensenak ์ถ”๊ฐ€ ์ •๋ณด ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์—ฌ๊ธฐ์—์„œ ์žฌํ˜„ํ•˜๋ ค๊ณ  ๊ณ„์† ๋…ธ๋ ฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. 20%์—์„œ๋Š” ํ™•์‹คํžˆ ํŠธ๋ฆฌ๊ฑฐํ•  ๋งŒํผ ์ถฉ๋ถ„ํžˆ ์‹œ๋„ํ•˜์ง€ ์•Š์•˜์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚ด ๋ฆฌ๋ชจ์ปจ์€ Mac๊ณผ ์ผ๋ถ€ ์˜ค๋ž˜๋œ ๋ฐ๋น„์•ˆ์ด์—ˆ๊ณ , ์šฐ๋ถ„ํˆฌ ํŠธ๋Ÿฌ์Šคํ‹ฐ๊ฐ€ ๊ทธ๊ฒƒ์— ํŠน์ •ํ•œ ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•ด Ubuntu Trusty๋ฅผ ์‚ฌ์šฉํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์ด์ƒํ•˜์ง€๋งŒ ์ด ๋ชจ๋“  ๊ฒƒ์ด ์ด์ƒํ•ฉ๋‹ˆ๋‹ค.)

๋˜ํ•œ ๋กœ์ปฌ ์‰˜ ํ™˜๊ฒฝ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๋‚ด ๊ฒƒ์€ tmux ๋‚ด๋ถ€์˜ Terminal.app ๋‚ด์žฅ (๋‹ค์‹œ macOS 10.12)์—์„œ zsh์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋˜ํ•œ ๊ทธ ๊ฐ๋„์— ๋Œ€ํ•ด ์•ฝ๊ฐ„์˜ ์ˆœ์—ด์„ ์‹œ๋„ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์•„ํ•˜. ์ด๊ฒƒ์€ bash์—๋งŒ ํ•ด๋‹น๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค! ์—ฌ์ „ํžˆ tmux ์™ธ๋ถ€์˜ zsh์—์„œ ์žฌํ˜„ํ•  ์ˆ˜ ์—†์—ˆ์ง€๋งŒ bash์—์„œ ์‹œ๋„ํ•˜๋Š” ์ˆœ๊ฐ„ ์–ธ๊ธ‰๋œ ์ฆ์ƒ์ด ์ฆ‰์‹œ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. tmux ๋‚ด๋ถ€์™€ ๋™์ผํ•˜๋ฏ€๋กœ tmux์—๋Š” ๋ฒ ์–ด๋ง์ด ์—†์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์‰˜ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

_์™œ_ ์ด๊ฒƒ์€ bash์™€ zsh์—์„œ ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฆ‰๊ฐ์ ์ธ ์•„์ด๋””์–ด๋Š” ์—†์Šต๋‹ˆ๋‹ค. ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์— ๋”ฐ๋ผ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ๋‚ด zsh dotfiles์˜ ๋ฌด์–ธ๊ฐ€๊ฐ€ ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ํŒŒ๊ธฐํ•ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค ... Python ์ธก์—์„œ ์†”๋ฃจ์…˜์„ ์‹๋ณ„ํ•˜๋Š” ๊ฒƒ์ด ์–ด๋Š ์ชฝ์ด๋“  ๊ฐ€์žฅ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค.

ํŽธ์ง‘: ๋˜ํ•œ ๋‚ด ๋กœ์ปฌ ํ˜ธ์ŠคํŠธ์˜ sshd์— ๋™์‹œ์— ์—ฌ๋Ÿฌ ๋ฒˆ ์—ฐ๊ฒฐํ•  ๋•Œ๋„ ์žฌ์ƒ์‚ฐ์ด ๋ฐœ์ƒํ•˜๋Š”๋ฐ, ์ด๋Š” ๊ทธ๋ฆฌ ๋†€๋ผ์šด ์ผ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์›๊ฒฉ ๋์€ ์ค‘์š”ํ•˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ "์ด์ „ ์‹คํ–‰์„ ์ œ์™ธํ•œ ์ด์ „ ์‹คํ–‰์€ ๋‹ค์Œ ์‹คํ–‰์— ๋Œ€ํ•œ ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•จ"์— ๋Œ€ํ•œ ๋ฉ”๋ชจ๋ฅผ ํ™•์ธํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ์ง€๋งŒ ์ €์—๊ฒŒ๋Š” ๋ฐœ์ƒํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ด€๊ณ„์—†์ด ๋งค๋ฒˆ ํ–‰๋™์„ ์–ป์Šต๋‹ˆ๋‹ค.

Moar: ์–ด๋–ป๊ฒŒ ๋ ์ง€ ๋ณด๊ธฐ ์œ„ํ•ด sleep ๋ฅผ ์ œ๊ฑฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ ์•ฝ๊ฐ„ ๋” ๊ฐ„ํ—์ ์ด์ง€๋งŒ ์—ฌ์ „ํžˆ ์žฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์ž๋™ ๋ฃจํ”„์—์„œ ์žฌํ˜„ํ•˜๊ธฐ ์‰ฝ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋‘ ์†์œผ๋กœ ์žฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ˆ˜๊ฐ€ ์ ๊ณ  ์‹ค์ œ ๋ฐœ์ƒ๋ฅ ์ด ์‹ค์ œ์ผ ๊ฒƒ์ž„์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ ์ธก์ •์ด ์–ด๋ ต์Šต๋‹ˆ๋‹ค.)

๊ทธ๊ฒƒ๋„ ์ข‹์Šต๋‹ˆ๋‹ค. ์ด์ƒํ•œ ํŠธ๋ฆฌ๊ฑฐ๊ฐ€ ์ ์„์ˆ˜๋ก ์ข‹์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์–ด๋”˜๊ฐ€์— ๊ธฐ๋ณธ์ ์ด๊ณ  ๋ฉ์ฒญํ•œ ์Šค๋ ˆ๋”ฉ ์‹ค์ˆ˜์ผ ๊ฒƒ ๊ฐ™์€ _should_์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๊ฒฝ์Ÿ ์กฐ๊ฑด(๋˜๋Š” w/e)์„ ๋” ๋งŽ์ด ๋งŒ๋“œ๋Š” ์‹œ๊ฐ„์„ ์ œ์™ธํ•˜๊ณ  ์›๊ฒฉ ๋˜๋Š” ๋กœ์ปฌ ๋์˜ ํŠน์ • ํ•ญ๋ชฉ์— ์˜ํ•ด ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด Invoke์˜ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ์Šค๋ ˆ๋“œ ํ•˜์œ„ ํด๋ž˜์Šค(์—ฌ๊ธฐ์„œ ThreadingGroup์—์„œ ์‚ฌ์šฉ๋จ)๋กœ ์š”์•ฝ๋˜๋Š” pyinvoke/invoke#552์™€ ๊ด€๋ จ์ด ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•˜์—ฌ ์Šค๋ ˆ๋“œ ์ฃฝ์Œ ๊ฐ์ง€๋ฅผ ๋ง์ณค์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

(์ž ์žฌ์  ์ˆ˜์ •์ธ pyinvoke/invoke#553์ด ์ธ์Šคํƒ€ ๋ณ‘ํ•ฉ์ด ์•„๋‹ˆ๋ผ๋Š” ์ ์„ ์ดํ•ดํ–ˆ๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ๋ญ”๊ฐ€ ๋ช…๋ฐฑํ•˜๊ฒŒ ๊ธฐ๋Šฅ์ ์ด์–ด์„œ ์ž˜๋ชป๋œ ๊ฒƒ์„ ์–ป์€ ๊ฒƒ์ด ์ด์ƒํ•ด ๋ณด์˜€๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.) ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ ์šฉ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ฆ์ƒ์ด ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚ ์ง€ ๋ณด๊ธฐ ์œ„ํ•ด ์ž ์„ ์ œ๊ฑฐํ–ˆ๋‹ค. ์ง€๊ธˆ์€ ์•ฝ๊ฐ„ ๋” ๊ฐ„ํ—์ ์ด์ง€๋งŒ ์—ฌ์ „ํžˆ ์žฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋˜ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์ฒ˜๋Ÿผ ๋“ค๋ฆฌ๋Š”๋ฐ, ๋ฒ„๊ทธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์ „์— ๋ช‡ ๋ฒˆ ์ณค์–ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ž˜ ๋‹ค๋ฃจ์‹œ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค

๋‚˜๋Š” ์˜ค๋Š˜ ๋‚ด๊ฐ€ ํ•œ ๋‹ฌ ์ „์— ์„ค๋ช…ํ•œ ์˜ˆ์™ธ ๋™์ž‘์„ ์žฌํ˜„ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค... ๋ถˆํ–‰ํžˆ๋„ ๋‚˜๋Š” ๊ทธ๋•Œ ๋ฌด์—‡์„ ํ•˜๊ณ  ์žˆ์—ˆ๋Š”์ง€ ๊ธฐ์–ต์ด ๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. :/

๋‚˜๋Š” ์‹ค์ œ๋กœ ์—ฌ๊ธฐ์„œ bash๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ž˜ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๊ฐ€ ์ž ์„ ์ž์ง€ ์•Š๊ณ  ๊ฐ„ํ—์ ์œผ๋กœ ๋ฐœ์ƒํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์€ ์ด๊ฒƒ์ด ์ผ์ข…์˜ ๊ฒฝ์Ÿ ์กฐ๊ฑด์ธ์ง€ ๊ถ๊ธˆํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

๋‹น์‹ ์€ ๊ทธ๋ ‡๊ฒŒ ๋งํ•˜์ง€๋งŒ ์ง€๊ธˆ์€ ๊ทธ๊ฒƒ์„ ๋‹ค์‹œ ์žฌํ˜„ํ•  ์ˆ˜ ์—†๊ฑฐ๋‚˜ ์ตœ์†Œํ•œ ๋งค์šฐ ๊ฐ„ํ—์ ์ž…๋‹ˆ๋‹ค. ๋‹ค์‹œ ์ž ์„ ์ž๊ฒŒ ํ•˜๋ฉด ์ž ์ด ํ›จ์”ฌ ๋” ์ž์ฃผ ์ผ์–ด๋‚˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋ ˆ์ด์Šค ์กฐ๊ฑด์„ ์ข‹์•„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Invoke ๋ฌธ์ œ๋ฅผ ๋ณด๋ฉด ๊ธฐ์ž๋Š” ์—‰๋ง์ธ ํ„ฐ๋ฏธ๋„์„ ์ฆ์ƒ์œผ๋กœ ์–ธ๊ธ‰ํ•˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด์ƒํ•˜๊ฒŒ๋„ ๋‚˜๋Š” ๊ทธ์˜ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ bash์—์„œ๋„ _๊ทธ_ ์ฆ์ƒ์„ ์žฌํ˜„ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทผ๋ณธ ์›์ธ์ด ๊ฐ™๋‹ค๋ฉด ์—ฌ์ „ํžˆ ๋†€๋ผ์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค(์“ฐ๋ ˆ๋“œ ์ข…๋ฃŒ ๋ฐ stdin์ด ๋‹ซํžˆ๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จ์ด ์žˆ๊ฑฐ๋‚˜ ์ข…๋ฃŒํ•˜๊ธฐ ์ „์— ์ ์ ˆํ•˜๊ฒŒ ๋ผ์ธ๋ณ„ ๋ฒ„ํผ๋ง์œผ๋กœ ๋‹ค์‹œ ์„ค์ •ํ•ด์•ผ ํ•จ).

์—ฌ๊ธฐ์—์„œ ์žฌํ˜„ ์‚ฌ๋ก€์— ๋Œ€ํ•ด ๋‹ค๋ฅธ ๋ฌธ์ œ๊ฐ€ ์–ธ๊ธ‰ํ•œ ๋ถ€๋ถ„์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

  • ExceptionHandlingThread.is_dead ๋น„ํŠธ๋Š” ์ค‘์š”ํ•˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์ •ํ™•ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์Šค๋ ˆ๋“œ์—์„œ ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด๊ณ  ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ ์ค‘ ์–ด๋Š ๊ฒƒ๋„ ์‹ค์ œ๋กœ ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋Š ์ •๋„ ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. is_dead ๋Š” ๋‚ด๊ฐ€ ์˜ˆ์ƒํ•  ๋•Œ ๋ชจ๋“  3๊ฐœ์˜ ์ž‘์—…์ž ์Šค๋ ˆ๋“œ(stdin/out/err)์— ๋Œ€ํ•ด False ์ž…๋‹ˆ๋‹ค.
  • ํ•˜์œ„ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ œ๋Œ€๋กœ ๋‹ซ์ง€ ์•Š๊ณ  ์žˆ๋‹ค๋Š” ์ฃผ์žฅ' stdin์ด ํ‘œ์‹œ์— ๋” ๊ฐ€๊น์Šต๋‹ˆ๋‹ค. ์ œ์–ด ํ„ฐ๋ฏธ๋„์˜ stdin์ด ์ด์ œ ์ฃฝ์€ ํŒŒ์ผ ์„ค๋ช…์ž ๋˜๋Š” ๊ธฐํƒ€ ํ•ญ๋ชฉ์— ์ฒจ๋ถ€๋œ ์ƒํƒœ๋กœ ์œ ์ง€๋œ๋‹ค๋ฉด...? (์–ด์จŒ๋“  ์ด ๊ฒฝ์šฐ์— ์–ด๋–ป๊ฒŒ ๋˜๋Š”์ง€ ๋” ์ž˜ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.)

    • Fabric์˜ ๊ฒฝ์šฐ๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” ๋กœ์ปฌ ํ•˜์œ„ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์—†๊ณ  ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ์ง์ ‘ ํ†ต๊ณผํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๊ทธ๋Ÿด ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

    • ๋ฌธ์ œ๊ฐ€ ๋‹ค๋ฅธ ๋ฌธ์ œ์ผ ๊ฐ€๋Šฅ์„ฑ์ด ๋” ๋†’๋‹ค๋Š” ์˜๋ฏธ์ธ๊ฐ€์š”?


๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ์‹œ๋„ํ•˜๋Š” ์ค‘์ž…๋‹ˆ๋‹ค. ๋ฒ„๊ทธ๊ฐ€ ๋ฐœ์ƒํ•œ ํ›„ ํ„ฐ๋ฏธ๋„ ํ™˜๊ฒฝ์ด ์ •ํ™•ํžˆ ์–ด๋–ป๊ฒŒ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๊นŒ? ๋ฒ„๊ทธ ์†์ƒ ์œ ๋ฌด์— ๊ด€๊ณ„์—†์ด bash์—์„œ stty -a ์‹คํ–‰ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฐจ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • lflags : ๋ฒ„๊ทธ๊ฐ€ ์žˆ๋Š” ํ„ฐ๋ฏธ๋„์—๋Š” -icanon , -echo , -pendin (๋ชจ๋‘ ๋นผ๊ธฐ ๊ธฐํ˜ธ๊ฐ€ ์—†๋Š” ์ผ๋ฐ˜ ์šฉ์–ด์™€ ๋น„๊ต). ์—์ฝ”ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์€ ๊ทธ๊ฒƒ์ด ์˜๋ฏธํ•˜๋Š” ๋ฐ”๋ผ๊ณ  ๊ฐ€์ •ํ•  ๋•Œ ํ™•์‹คํžˆ ๋ฌธ์ œ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.
  • iflags : bugged-out์—๋Š” -ixany ๋ฐ ignpar (์ž˜๋ชป๋œ ์„ค์ •์—์„œ ์„ค์ •๋˜์ง€ ์•Š์€ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์„ค์ •๋˜๋Š” ์ฒซ ๋ฒˆ์งธ ์˜ˆ).
  • oflags ๋ฐ cflags ๋™์ผ, ๊ฐ™์€์žˆ๋‹ค cchars (I ์‹ค์ œ ์ง€๋‚ด์ง€ ํ•  ๊ฒƒ ์ œ์–ด ๋ฌธ์ž๋ฅผ ๋ณ€๊ฒฝ ํ•œ ๊ฒฝ์šฐ ...)

man stty ์— ๋”ฐ๋ฅด๋ฉด:

  • icanon ๋Š” ERASE ๋ฐ KILL ์ฒ˜๋ฆฌ๋ฅผ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ํฐ ์ฐจ์ด๋Š” ์•„๋‹ ๊ฒƒ์ž…๋‹ˆ๋‹ค(์ด๊ฒƒ์ด ์„ค์ •๋˜๊ฑฐ๋‚˜ ์„ค์ •๋˜์ง€ ์•Š์€ ์ด์œ ๋Š” ํฅ๋ฏธ๋กœ์šธ ์ˆ˜ ์žˆ์Œ)
  • echo ๋Š” ์†Œ๋ฆฌ๊ฐ€ ๋‚˜๋Š”์ง€ ์—ฌ๋ถ€, ์—์ฝ” ์—ฌ๋ถ€์ด๋ฉฐ ๋ถ„๋ช…ํžˆ ๋ฒ„๊ทธ์˜ ๊ฐ€์žฅ ํฐ ์‹ค์ œ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.
  • pendin ๋Š” ํ‘œ์ค€ ์Šค์œ„์น˜ ์ดํ›„์— ์ž…๋ ฅ(stdin์œผ๋กœ ๊ฐ€์ •)์ด ๋ณด๋ฅ˜ ์ค‘์ธ์ง€ ์—ฌ๋ถ€๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ( icanon ๊ฐ€ ๋ช…ํ™•ํ•˜๊ฒŒ ๋’ค์ง‘ํ˜”๊ธฐ ๋•Œ๋ฌธ์—...์˜ˆ) ์ฝ๊ธฐ๊ฐ€ ๋ณด๋ฅ˜ ์ค‘์ด๊ฑฐ๋‚˜ ๋” ๋งŽ์€ ์ž…๋ ฅ์ด ๋  ๋•Œ ๋‹ค์‹œ ์ž…๋ ฅ๋ฉ๋‹ˆ๋‹ค. ๋„์ฐฉ. ์ด๊ฒƒ์ด ์™œ ์ค‘์š”ํ•œ์ง€ ๋˜๋Š” ๋ฒ„๊ทธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์ •์ƒ์ ์œผ๋กœ ์„ค์ •๋˜๊ณ  ์„ค์ •๋˜์ง€ ์•Š์€ ์ด์œ ๊ฐ€ ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(ํ›„์ž๊ฐ€ ์žˆ๋‹ค๋ฉด ํ›„์ž๋ฅผ ์˜ˆ์ƒํ–ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.)
  • ixany ๋Š” ๋ชจ๋“  ๋ฌธ์ž๊ฐ€ '์ถœ๋ ฅ ์‹œ์ž‘'์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค(์„ค์ •๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ START๋งŒ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ok?)
  • ignpar ๋Š” ํŒจ๋ฆฌํ‹ฐ ์˜ค๋ฅ˜๊ฐ€ ์žˆ๋Š” ๋ฌธ์ž๋ฅผ ๋ฌด์‹œ(๋˜๋Š” ์„ค์ • ํ•ด์ œ, ๋ฌด์‹œํ•˜์ง€ ์•Š์Œ)ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๋Œ€์ฒด๋กœ ์‚ฌ์šฉ์ž ๋งค์‰ฌ๊ฐ€ ์ž…๋ ฅ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋Œ€์‹  ํ•œ ๋ฒˆ์— 1๋ฐ”์ดํŠธ๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ๋„๋ก stdin์„ ๋ฌธ์ž ๋ฒ„ํผ ์ฝ๊ธฐ๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ๋” ๋†’์€ ์ˆ˜์ค€์˜ '๋ชจ๋“œ'๊ฐ€ ํ„ฐ๋ฏธ๋„์— ์ ์šฉ๋˜๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด๋Š” ํ‘œ์‹œ ์ค‘์ธ ๋™์ž‘(์ผ์ข…์˜...)์ฒ˜๋Ÿผ ๋“ค๋ฆฌ๋ฉฐ ์ด์ „์— ๊ถ๊ธˆํ–ˆ๋˜ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ฌธ์ œ์˜ ์ฝ”๋“œ๋ฅผ ์ฝ์œผ๋ฉด(Invoke ํŒจ์น˜์—์„œ๋„ ์ด๋ฅผ ์–ธ๊ธ‰ํ•˜์ง€๋งŒ re: thread death), ๋ชจ๋“œ ๋ณ€๊ฒฝ์€ ์ปจํ…์ŠคํŠธ ๊ด€๋ฆฌ์ž๋กœ ํ‘œํ˜„๋˜๋ฏ€๋กœ ๋ฃจํ”„๋ฅผ ์–ด๋–ป๊ฒŒ ๋ฒ—์–ด๋‚˜๋Š”์ง€์— ๊ด€๊ณ„์—†์ด ํ•ญ์ƒ ์„ค์ • ํ•ด์ œ๋˜์–ด์•ผ _ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค_. ํ•˜์ง€๋งŒ ์ง€๊ธˆ์€ ์„ธ ๋ฒˆ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋งˆ์ด๋„ˆ : ๋‹จ์ˆœํžˆ ๋งํ•˜๋Š” stty echo ์„ค์ • echo '์ˆ˜์ •'ํ„ฐ๋ฏธ๋„์— ์ถฉ๋ถ„๋ฅผ; icanon , pendin ๋“ฑ์ด ์•„์ง ์„ค์ •๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ๋ณ„ ๋„์›€์€ ์•ˆ๋˜์ง€๋งŒ ์•Œ์•„๋‘์‹œ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์š”.

์ข‹์•„์š”! ๋‚˜๋Š” ๊ทธ contextmanager๋ฅผ ๋ฐ”๋ผ๋ณด๋ฉด์„œ ๊ทธ๊ฒƒ์„ ์•Œ์•„๋ƒˆ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ์•„๋งˆ๋„ contextmanager๊ฐ€ ๋ธ”๋ก์„ ๋‹ซ์„ ๋•Œ ๋ณต์›์„ ์œ„ํ•ด ํ˜„์žฌ ํ„ฐ๋ฏธ๋„ ์ƒํƒœ๋ฅผ ์Šค๋ƒ…์ƒทํ•˜๊ธฐ ๋•Œ๋ฌธ์ผ ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด ๊ฒฝ์šฐ์— ์šฐ๋ฆฌ๋Š” ๋ฌด์—‡์„ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ์šฐ๋ฆฌ๋Š” _๋‘ ๊ฐœ์˜ ๊ฐœ๋ณ„ ์ƒ์œ„ ์ˆ˜์ค€ ์Šค๋ ˆ๋“œ_๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ๊ฐ๊ฐ์€ ์ด ์ปจํ…์ŠคํŠธ ๊ด€๋ฆฌ์ž์˜ _์ž์ฒด ์‚ฌ๋ณธ_์„ ์‹คํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค!

๊ทธ๋ฆฌ๊ณ  Invoke์—์„œ๋Š” ์Šค๋ ˆ๋“œ์„ธ์ดํ”„๋ฅผ ์‹œ๋„ํ•˜์ง€๋งŒ ํ˜„์žฌ ์ž์ฒด ์ €์ˆ˜์ค€ IO ์Šค๋ ˆ๋“œ ์™ธ์—๋Š” ํ…Œ์ŠคํŠธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. "์Šค๋ ˆ๋“œ ์•ˆ์ „์„ฑ"์˜ 99%๋Š” ๋‹จ์ˆœํžˆ Fabric 1์˜ ๋”์ฐํ•œ ์ „์—ญ ๋ชจ๋“ˆ ์ƒํƒœ ๋Œ€์‹  ์ž์ฒด ํฌํ•จ๋œ ๊ฐœ์ฒด ์ƒํƒœ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด ํŠน์ • ์ƒํƒœ ์œ ์ง€ ๋น„ํŠธ๋Š” ๊ทธ ์ž์ฒด์™€ ๋™์‹œ์— ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(๋ถ€๋ถ„์ ์œผ๋กœ "์ƒํƒœ"๊ฐ€ ๋ง ๊ทธ๋Œ€๋กœ ์ œ์–ด ํ„ฐ๋ฏธ๋„์ด๊ณ , ๊ทธ ์ค‘ ํ•˜๋‚˜๋Š” ๋‹จ ํ•˜๋‚˜์ด๋ฏ€๋กœ...์ „์—ญ ์ƒํƒœ...).

๋‚˜๋Š” ์•„์ง ๊ทธ๊ฒƒ์„ 100% ์ฆ๋ช…ํ•˜์ง€ ์•Š์•˜์ง€๋งŒ(๊ณง) ์ด๊ฒƒ์ด ์•„๋‹ ๋ฐฉ๋ฒ•์€ ์—†์Šต๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ๋กœ ์‹คํ–‰๋˜๋Š” ์Šค๋ ˆ๋“œ๋Š” ์ฒซ ๋ฒˆ์งธ ์Šค๋ ˆ๋“œ๊ฐ€ ์ด๋ฏธ ์ด๋ฅผ ๋ฌธ์ž ๋ฒ„ํผ ๋ชจ๋“œ๋กœ ์„ค์ •ํ•œ _์ดํ›„_ ์ œ์–ด ํ„ฐ๋ฏธ๋„ ์†์„ฑ์„ ์Šค๋ƒ…์ƒทํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ, ๊ทธ ๋‘ ๋ฒˆ์งธ ์Šค๋ ˆ๋“œ๊ฐ€ ๋‘ ๋ฒˆ์งธ๋กœ _๋งˆ๊ฐ__ํ•˜๋ฉด(๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ ํ™•์‹คํ•˜์ง€๋Š” ์•Š์ง€๋งŒ) ์ž˜๋ชป๋œ ์ƒํƒœ๋ฅผ "๋ณต์›"ํ•˜์—ฌ ์ฒซ ๋ฒˆ์งธ ์Šค๋ ˆ๋“œ์˜ ๋ณต์›์„ ํšจ๊ณผ์ ์œผ๋กœ ์ทจ์†Œํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ECHO ํ”Œ๋ž˜๊ทธ๊ฐ€ ์ฒซ ๋ฒˆ์งธ๊ฐ€ ์•„๋‹Œ ์ปจํ…์ŠคํŠธ ๊ด€๋ฆฌ์ž์— ์˜ํ•ด ํ™•์‹คํžˆ ์Šค๋ƒ…์ƒท๋œ ๋‹ค์Œ ๋™์ผํ•˜๊ฒŒ ๋ณต์›๋˜๋Š”์ง€ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค. ์†”๋ฃจ์…˜์— ๋Œ€ํ•œ ์ž‘์—…์€ "setcbreak๊ฐ€ ์ด๋ฏธ ์ ์šฉ๋œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋Š”์ง€ ํŒŒ์•…ํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜๊ณ  ์Šค๋ƒ…์ƒท-์ˆ˜์ •-๋ณต์› ๋Œ„์Šค๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋Œ€์‹  ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”" ๊ฒƒ์œผ๋กœ ๋๋‚  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์˜๋„ํ•œ ํšจ๊ณผ๊ฐ€ ์žˆ์–ด์•ผ ํ•˜๊ณ  ๋ถ€ํŒ…ํ•˜๊ธฐ์— ์•ฝ๊ฐ„ ๋” ๊นจ๋—ํ•˜๊ณ (setcbreak >1๋ฒˆ ์‹คํ–‰ํ•˜์ง€ ์•Š์Œ) ์ˆœ์ง„ํ•œ ์ˆ˜์ •์ด ํ•ญ์ƒ ECHO ๋“ฑ์„ "on"์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” ์ฝ”๋„ˆ ์ผ€์ด์Šค๋ฅผ ํ”ผํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ œ์˜ ์ŠคํŠธ๋ฆผ์ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ƒํ™ฉ์—์„œ ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค. tty์™€ ๋น„์Šทํ•˜์ง€๋งŒ ์—์ฝ”ํ•˜์ง€ ์•Š๋„๋ก _์ด๋ฏธ_ ์„ค์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค. (ํ™•์‹คํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ๋ถˆ๊ฐ€๋Šฅํ•˜์ง€๋Š” ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.)

์ด๊ฒƒ์€ Invoke ์ „์šฉ ๋ฌธ์ œ์ด๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ํŠธ๋ž˜์ปค์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ณง ํ…Œ์ŠคํŠธ ๋ฐ ์ˆ˜์ •์ด ์™„๋ฃŒ๋  ๊ฒƒ์œผ๋กœ ๊ธฐ๋Œ€ํ•˜๊ณ  ์žˆ์ง€๋งŒ ์ถ”๊ฐ€ํ•  ๋‹ค๋ฅธ ๊ฒƒ์ด ์žˆ์œผ๋ฉด https ๋กœ ์ด๋™

๋ช…ํ™•ํ•˜๊ฒŒ ํ•˜์ž๋ฉด, ์ผ๋‹จ ์ˆ˜์ •๋˜๋ฉด Invoke 1.0.2/1.1.1(๋™์‹œ์— ๊ฐ€์ ธ์˜ค๋Š” ๊ฒฝ์šฐ 1.2.0 ๊ฐ€๋Šฅ)์— ์žˆ์–ด์•ผ ํ•˜๋ฉฐ _no_ ํŒจ๋ธŒ๋ฆญ ์—…๊ทธ๋ ˆ์ด๋“œ๊ฐ€ ํ•„์š”ํ•˜๊ณ  Invoke๋งŒ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@bitprophet Invoke๋ฅผ ์—…๊ทธ๋ ˆ์ด๋“œ ํ•œ ํ›„ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค :)
๋‹น์‹ ์˜ ๋…ธ๊ณ ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰