strace๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์†Œํ”„ํŠธ์›จ์–ด ๋ฐฐํฌ ๋””๋ฒ„๊น…

strace๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์†Œํ”„ํŠธ์›จ์–ด ๋ฐฐํฌ ๋””๋ฒ„๊น…

์ œ๊ฐ€ ํ•˜๋Š” ์ผ์€ ๋Œ€๋ถ€๋ถ„ ์†Œํ”„ํŠธ์›จ์–ด ๋ฐฐํฌ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์งˆ๋ฌธ์— ๋‹ต๋ณ€ํ•˜๋Š” ๋ฐ ๋งŽ์€ ์‹œ๊ฐ„์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.

  • ์ด ์†Œํ”„ํŠธ์›จ์–ด๋Š” ๊ฐœ๋ฐœ์ž์—๊ฒŒ๋Š” ์ž‘๋™ํ•˜์ง€๋งŒ ๋‚˜์—๊ฒŒ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์™œ?
  • ์–ด์ œ๋Š” ์ด ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ ์ œ๊ฒŒ ํšจ๊ณผ๊ฐ€ ์žˆ์—ˆ์ง€๋งŒ ์˜ค๋Š˜์€ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์™œ?

์ด๋Š” ์ผ๋ฐ˜์ ์ธ ์†Œํ”„ํŠธ์›จ์–ด ๋””๋ฒ„๊น…๊ณผ ์•ฝ๊ฐ„ ๋‹ค๋ฅธ ์ผ์ข…์˜ ๋””๋ฒ„๊น…์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜ ๋””๋ฒ„๊น…์€ ์ฝ”๋“œ์˜ ๋…ผ๋ฆฌ์— ๊ด€ํ•œ ๊ฒƒ์ด์ง€๋งŒ ๋ฐฐํฌ ๋””๋ฒ„๊น…์€ ์ฝ”๋“œ์™€ ํ™˜๊ฒฝ ๊ฐ„์˜ ์ƒํ˜ธ ์ž‘์šฉ์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฌธ์ œ์˜ ๊ทผ๋ณธ ์›์ธ์ด ๋…ผ๋ฆฌ์  ์˜ค๋ฅ˜์ธ ๊ฒฝ์šฐ์—๋„ ๋ชจ๋“  ๊ฒƒ์ด ํ•œ ์‹œ์Šคํ…œ์—์„œ๋Š” ์ž‘๋™ํ•˜๊ณ  ๋‹ค๋ฅธ ์‹œ์Šคํ…œ์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์‚ฌ์‹ค์€ ๋ฌธ์ œ๊ฐ€ ํ™˜๊ฒฝ์— ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ผ๋ฐ˜์ ์ธ ๋””๋ฒ„๊น… ๋„๊ตฌ ๋Œ€์‹  gdb ๋ฐฐํฌ ๋””๋ฒ„๊น…์„ ์œ„ํ•œ ๋‹ค๋ฅธ ๋„๊ตฌ ์„ธํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  "์ด ์†Œํ”„ํŠธ์›จ์–ด๋Š” ์™œ ๋‚˜์—๊ฒŒ ์ž‘๋™ํ•˜์ง€ ์•Š๋‚˜์š”?"์™€ ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ œ๊ฐ€ ๊ฐ€์žฅ ์ข‹์•„ํ•˜๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ~๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ์ถ”์ ํ•˜๋‹ค.

์ŠคํŠธ๋ ˆ์ด์Šค๋ž€ ๋ฌด์—‡์ธ๊ฐ€์š”?

์ถ”์ ํ•˜๋‹ค "์‹œ์Šคํ…œ ํ˜ธ์ถœ ์ถ”์ "์„ ์œ„ํ•œ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ์›๋ž˜ Linux์šฉ์œผ๋กœ ๋งŒ๋“ค์–ด์กŒ์ง€๋งŒ ๋‹ค๋ฅธ ์‹œ์Šคํ…œ์šฉ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋™์ผํ•œ ๋””๋ฒ„๊น… ํŠธ๋ฆญ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(DTrace ๋˜๋Š” ktration).

๊ธฐ๋ณธ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์€ ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ์•„๋ฌด ๋ช…๋ น์ด๋‚˜ ์‚ฌ์šฉํ•˜์—ฌ strace๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋ชจ๋“  ์‹œ์Šคํ…œ ํ˜ธ์ถœ์ด ๋คํ”„๋ฉ๋‹ˆ๋‹ค(๋ฌผ๋ก  ๋จผ์ € ์ง์ ‘ ์„ค์น˜ํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Œ). ์ถ”์ ํ•˜๋‹ค):

$ strace echo Hello
...Snip lots of stuff...
write(1, "Hellon", 6)                  = 6
close(1)                                = 0
close(2)                                = 0
exit_group(0)                           = ?
+++ exited with 0 +++

์ด ์‹œ์Šคํ…œ ํ˜ธ์ถœ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ด๋Š” ์šด์˜ ์ฒด์ œ ์ปค๋„์šฉ API์™€ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค. ์˜›๋‚  ์˜›์ ์—๋Š” ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ ์‹คํ–‰๋˜๋Š” ํ•˜๋“œ์›จ์–ด์— ์ง์ ‘ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํ™”๋ฉด์— ๋ฌด์–ธ๊ฐ€๋ฅผ ํ‘œ์‹œํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ๋น„๋””์˜ค ์žฅ์น˜์šฉ ํฌํŠธ๋‚˜ ๋ฉ”๋ชจ๋ฆฌ ๋งคํ•‘๋œ ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์žฌ์ƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฉ€ํ‹ฐํƒœ์Šคํ‚น ์ปดํ“จํ„ฐ ์‹œ์Šคํ…œ์ด ๋Œ€์ค‘ํ™”๋˜์ž ๋‹ค์–‘ํ•œ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด ํ•˜๋“œ์›จ์–ด๋ฅผ ๋‘๊ณ  ์‹ธ์šฐ๋ฉด์„œ ํ˜ผ๋ž€์ด ๋‹ฅ์ณค์Šต๋‹ˆ๋‹ค. ํ•œ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ์˜ค๋ฅ˜๋กœ ์ธํ•ด ์ „์ฒด ์‹œ์Šคํ…œ์€ ์•„๋‹ˆ๋”๋ผ๋„ ๋‹ค๋ฅธ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด ์ค‘๋‹จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๊ถŒํ•œ ๋ชจ๋“œ(๋˜๋Š” "๋ง ๋ณดํ˜ธ")๊ฐ€ CPU์— ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. ์ปค๋„์€ ๊ฐ€์žฅ ๋†’์€ ๊ถŒํ•œ์„ ๊ฐ–๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ํ•˜๋“œ์›จ์–ด์— ๋Œ€ํ•œ ์ „์ฒด ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ์–ป์—ˆ๊ณ  ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ํ†ตํ•ด ํ•˜๋“œ์›จ์–ด์™€ ์ƒํ˜ธ ์ž‘์šฉํ•˜๊ธฐ ์œ„ํ•ด ์ด๋ฏธ ์ปค๋„์— ์•ก์„ธ์Šค๋ฅผ ์š”์ฒญํ•ด์•ผ ํ–ˆ๋˜ ๊ถŒํ•œ์ด ๋‚ฎ์€ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ์ƒ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ฐ”์ด๋„ˆ๋ฆฌ ์ˆ˜์ค€์—์„œ ์‹œ์Šคํ…œ ํ˜ธ์ถœ์€ ๊ฐ„๋‹จํ•œ ํ•จ์ˆ˜ ํ˜ธ์ถœ๊ณผ ์•ฝ๊ฐ„ ๋‹ค๋ฅด์ง€๋งŒ ๋Œ€๋ถ€๋ถ„์˜ ํ”„๋กœ๊ทธ๋žจ์€ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋ž˜ํผ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ €๊ฒƒ๋“ค. POSIX C ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—๋Š” ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์“ฐ๋‹ค(), ์‹œ์Šคํ…œ ํ˜ธ์ถœ์— ๋Œ€ํ•œ ๋ชจ๋“  ์•„ํ‚คํ…์ฒ˜๋ณ„ ์ฝ”๋“œ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์“ฐ๋‹ค.

strace๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์†Œํ”„ํŠธ์›จ์–ด ๋ฐฐํฌ ๋””๋ฒ„๊น…

๊ฐ„๋‹จํžˆ ๋งํ•ด์„œ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ํ•ด๋‹น ํ™˜๊ฒฝ(์ปดํ“จํ„ฐ ์‹œ์Šคํ…œ) ๊ฐ„์˜ ๋ชจ๋“  ์ƒํ˜ธ ์ž‘์šฉ์€ ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ํ†ตํ•ด ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ ํ•œ ์ปดํ“จํ„ฐ์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ์ปดํ“จํ„ฐ์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์‹œ์Šคํ…œ ํ˜ธ์ถœ ์ถ”์  ๊ฒฐ๊ณผ๋ฅผ ์‚ดํŽด๋ณด๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๋ณด๋‹ค ๊ตฌ์ฒด์ ์œผ๋กœ ๋‹ค์Œ์€ ์‹œ์Šคํ…œ ํ˜ธ์ถœ ์ถ”์ ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ๋ฐ˜์ ์ธ ์‚ฌํ•ญ ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค.

  • ์ฝ˜์†” I/O
  • ๋„คํŠธ์›Œํฌ I/O
  • ํŒŒ์ผ ์‹œ์Šคํ…œ ์•ก์„ธ์Šค ๋ฐ ํŒŒ์ผ I/O
  • ํ”„๋กœ์„ธ์Šค ์Šค๋ ˆ๋“œ์˜ ์ˆ˜๋ช… ๊ด€๋ฆฌ
  • ๋‚ฎ์€ ์ˆ˜์ค€์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ
  • ํŠน์ • ์žฅ์น˜ ๋“œ๋ผ์ด๋ฒ„์— ์•ก์„ธ์Šค

์–ธ์ œ strace๋ฅผ ์‚ฌ์šฉํ•˜๋‚˜์š”?

์ด๋ก ์— ์˜ํ•˜๋ฉด, ์ถ”์ ํ•˜๋‹ค ์‚ฌ์šฉ์ž ๊ณต๊ฐ„์˜ ๋ชจ๋“  ํ”„๋กœ๊ทธ๋žจ์€ ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉ์ž ๊ณต๊ฐ„์˜ ๋ชจ๋“  ํ”„๋กœ๊ทธ๋žจ๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋œ ์ €์ˆ˜์ค€ ํ”„๋กœ๊ทธ๋žจ์—์„œ ๋” ํšจ์œจ์ ์œผ๋กœ ์ž‘๋™ํ•˜์ง€๋งŒ, ๋Ÿฐํƒ€์ž„๊ณผ ์ธํ„ฐํ”„๋ฆฌํ„ฐ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์ถ”๊ฐ€์ ์ธ ์†Œ์Œ์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค๋ฉด Python๊ณผ ๊ฐ™์€ ๊ณ ๊ธ‰ ์–ธ์–ด์—์„œ๋„ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  ํ™”๋ คํ•จ ์†์—์„œ ์ถ”์ ํ•˜๋‹ค ํ•œ ์ปดํ“จํ„ฐ์—์„œ๋Š” ์ž˜ ์ž‘๋™ํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ์ปดํ“จํ„ฐ์—์„œ๋Š” ๊ฐ‘์ž๊ธฐ ์ž‘๋™์„ ๋ฉˆ์ถ”๋Š” ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๋””๋ฒ„๊น…ํ•˜๋Š” ๋™์•ˆ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ, ๊ถŒํ•œ ๋˜๋Š” ์ผ๋ถ€ ๋ช…๋ น์ด๋‚˜ ๋‹ค๋ฅธ ๊ฒƒ์„ ์‹คํ–‰ํ•˜๋ ค๋Š” ์‹คํŒจํ•œ ์‹œ๋„์— ๋Œ€ํ•œ ๋ชจํ˜ธํ•œ ๋ฉ”์‹œ์ง€๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค... ์•ˆํƒ€๊น์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ธ์ฆ์„œ ํ™•์ธ ์˜ค๋ฅ˜์™€ ๊ฐ™์€ ๋†’์€ ์ˆ˜์ค€์˜ ๋ฌธ์ œ์™€ ์ž˜ ๊ฒฐํ•ฉ๋ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” ์กฐํ•ฉ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ถ”์ ํ•˜๋‹ค๋•Œ๋•Œ๋กœ ์ถ”์  ๋” ๋†’์€ ์ˆ˜์ค€์˜ ๋„๊ตฌ(๋ช…๋ น์ค„ ๋„๊ตฌ ๋“ฑ) ํ•˜๋ ค๋ฉด openssl ์ธ์ฆ์„œ๋ฅผ ๋””๋ฒ„๊ทธํ•˜๊ธฐ ์œ„ํ•ด).

์˜ˆ์ œ์—์„œ๋Š” ๋…๋ฆฝ ์‹คํ–‰ํ˜• ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ ์‹œ์Šคํ…œ ํ˜ธ์ถœ ์ถ”์ ์€ ๋” ๋ณต์žกํ•œ ๋ฐฐํฌ ํ”Œ๋žซํผ์—์„œ ์ˆ˜ํ–‰๋  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ์˜ฌ๋ฐ”๋ฅธ ๋„๊ตฌ๋ฅผ ์„ ํƒํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๊ฐ„๋‹จํ•œ ๋””๋ฒ„๊น… ์˜ˆ์ œ

๋†€๋ผ์šด ์„œ๋ฒ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ธ foo๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์‹ถ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

$ foo
Error opening configuration file: No such file or directory

๋ถ„๋ช…ํžˆ ๋‹น์‹ ์ด ์ž‘์„ฑํ•œ ๊ตฌ์„ฑ ํŒŒ์ผ์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋•Œ๋•Œ๋กœ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž๊ฐ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ปดํŒŒ์ผํ•  ๋•Œ ์˜ˆ์ƒ ํŒŒ์ผ ์œ„์น˜๋ฅผ ์žฌ์ •์˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ•œ ๋ฐฐํฌํŒ์˜ ์„ค์น˜ ๊ฐ€์ด๋“œ๋ฅผ ๋”ฐ๋ฅด๋ฉด ๋‹ค๋ฅธ ๋ฐฐํฌํŒ์—์„œ๋Š” ์˜ˆ์ƒํ–ˆ๋˜ ๊ฒƒ๊ณผ ์™„์ „ํžˆ ๋‹ค๋ฅธ ํŒŒ์ผ์„ ๋ฐœ๊ฒฌํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€์— ๊ตฌ์„ฑ ํŒŒ์ผ์„ ์ฐพ์„ ์œ„์น˜๊ฐ€ ํ‘œ์‹œ๋˜๋ฉด ๋ช‡ ์ดˆ ์•ˆ์— ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ ์–ด๋””๋ฅผ ๋ด์•ผ ํ• ๊นŒ์š”?

์†Œ์Šค ์ฝ”๋“œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๊ทธ๊ฒƒ์„ ์ฝ๊ณ  ๋ชจ๋“  ๊ฒƒ์„ ์•Œ์•„๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ข‹์€ ๋ฐฑ์—… ๊ณ„ํš์ด์ง€๋งŒ ๊ฐ€์žฅ ๋น ๋ฅธ ์†”๋ฃจ์…˜์€ ์•„๋‹™๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‹จ๊ณ„๋ณ„ ๋””๋ฒ„๊ฑฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. gdb ํ”„๋กœ๊ทธ๋žจ์ด ๋ฌด์—‡์„ ํ•˜๋Š”์ง€ ์‚ดํŽด๋ณด์„ธ์š”. ๊ทธ๋Ÿฌ๋‚˜ ํ™˜๊ฒฝ๊ณผ์˜ ์ƒํ˜ธ ์ž‘์šฉ์„ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด ํŠน๋ณ„ํžˆ ์„ค๊ณ„๋œ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ๋” ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค. ์ถ”์ ํ•˜๋‹ค.

์ถœ๋ ฅ ์ถ”์ ํ•˜๋‹ค ์ค‘๋ณต๋˜์–ด ๋ณด์ผ ์ˆ˜ ์žˆ์ง€๋งŒ ์ข‹์€ ์†Œ์‹์€ ๋Œ€๋ถ€๋ถ„์„ ๋ฌด์‹œํ•ด๋„ ๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ถ”์  ๊ฒฐ๊ณผ๋ฅผ ๋ณ„๋„์˜ ํŒŒ์ผ์— ์ €์žฅํ•˜๋ ค๋ฉด -o ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์œ ์šฉํ•œ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.

$ strace -o /tmp/trace foo
Error opening configuration file: No such file or directory
$ cat /tmp/trace
execve("foo", ["foo"], 0x7ffce98dc010 /* 16 vars */) = 0
brk(NULL)                               = 0x56363b3fb000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=25186, ...}) = 0
mmap(NULL, 25186, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f2f12cf1000
close(3)                                = 0
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "177ELF2113 3 > 1 260A2 "..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=1824496, ...}) = 0
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f2f12cef000
mmap(NULL, 1837056, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f2f12b2e000
mprotect(0x7f2f12b50000, 1658880, PROT_NONE) = 0
mmap(0x7f2f12b50000, 1343488, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x22000) = 0x7f2f12b50000
mmap(0x7f2f12c98000, 311296, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x16a000) = 0x7f2f12c98000
mmap(0x7f2f12ce5000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1b6000) = 0x7f2f12ce5000
mmap(0x7f2f12ceb000, 14336, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f2f12ceb000
close(3)                                = 0
arch_prctl(ARCH_SET_FS, 0x7f2f12cf0500) = 0
mprotect(0x7f2f12ce5000, 16384, PROT_READ) = 0
mprotect(0x56363b08b000, 4096, PROT_READ) = 0
mprotect(0x7f2f12d1f000, 4096, PROT_READ) = 0
munmap(0x7f2f12cf1000, 25186)           = 0
openat(AT_FDCWD, "/etc/foo/config.json", O_RDONLY) = -1 ENOENT (No such file or directory)
dup(2)                                  = 3
fcntl(3, F_GETFL)                       = 0x2 (flags O_RDWR)
brk(NULL)                               = 0x56363b3fb000
brk(0x56363b41c000)                     = 0x56363b41c000
fstat(3, {st_mode=S_IFCHR|0620, st_rdev=makedev(0x88, 0x8), ...}) = 0
write(3, "Error opening configuration file"..., 60) = 60
close(3)                                = 0
exit_group(1)                           = ?
+++ exited with 1 +++

๋Œ€๋žต ์ถœ๋ ฅ ์ฒซ ๋ฒˆ์งธ ํŽ˜์ด์ง€ ์ „์ฒด ์ถ”์ ํ•˜๋‹ค - ์ด๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์ถœ์‹œ๋ฅผ ์œ„ํ•œ ๋‚ฎ์€ ์ˆ˜์ค€์˜ ์ค€๋น„์ž…๋‹ˆ๋‹ค. (์ „ํ™”๊ฐ€ ๋งŽ์ด ์™€์š”. mmap, ์— ํ”„๋กœํ…ํŠธ, BRK ๋‚ฎ์€ ์ˆ˜์ค€์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ฐ์ง€ ๋ฐ ๋™์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ‘œ์‹œ์™€ ๊ฐ™์€ ์ž‘์—…์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.) ์‹ค์ œ๋กœ ์ถœ๋ ฅ์„ ๋””๋ฒ„๊น…ํ•˜๋Š” ๋™์•ˆ ์ถ”์ ํ•˜๋‹ค ๋งจ ๋๋ถ€ํ„ฐ ์ฝ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์•„๋ž˜์— ์ฑŒ๋ฆฐ์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์“ฐ๋‹ค, ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์œ„๋ฅผ ๋ณด๋ฉด ์ฒซ ๋ฒˆ์งธ ์ž˜๋ชป๋œ ์‹œ์Šคํ…œ ํ˜ธ์ถœ์ธ ํ˜ธ์ถœ์ด ๋ณด์ž…๋‹ˆ๋‹ค. ์—ด๊ธฐ, ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์—๋…ธ์—”ํŠธ ("ํŒŒ์ผ ๋˜๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.") ์—ด๋ ค๊ณ  ํ•˜๋Š” ์ค‘ /etc/foo/config.json. ์—ฌ๊ธฐ์— ๊ตฌ์„ฑ ํŒŒ์ผ์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋‹จ์ง€ ์˜ˆ์ผ ๋ฟ์ด์ง€๋งŒ ์ œ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ์‹œ๊ฐ„์˜ 90%๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ถ”์ ํ•˜๋‹ค, ์ด๊ฒƒ๋ณด๋‹ค ๋” ์–ด๋ ค์šด ์ผ์€ ์—†์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ์™„์ „ํ•œ ๋‹จ๊ณ„๋ณ„ ๋””๋ฒ„๊น… ๊ฐ€์ด๋“œ์ž…๋‹ˆ๋‹ค.

  • ํ”„๋กœ๊ทธ๋žจ์˜ ์‹œ์Šคํ…œ ์˜ค๋ฅ˜์— ๋Œ€ํ•œ ๋ชจํ˜ธํ•œ ๋ฉ”์‹œ์ง€ ๋•Œ๋ฌธ์— ํ™”๋ฅผ ๋ƒ…๋‹ˆ๋‹ค.
  • ๋‹ค์Œ์œผ๋กœ ํ”„๋กœ๊ทธ๋žจ์„ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜์„ธ์š”. ์ถ”์ ํ•˜๋‹ค
  • ์ถ”์  ๊ฒฐ๊ณผ์—์„œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€ ์ฐพ๊ธฐ
  • ์ฒซ ๋ฒˆ์งธ ์‹คํŒจํ•œ ์‹œ์Šคํ…œ ํ˜ธ์ถœ์ด ๋ฐœ์ƒํ•  ๋•Œ๊นŒ์ง€ ๋” ๋†’์ด ์˜ฌ๋ผ๊ฐ‘๋‹ˆ๋‹ค.

4๋‹จ๊ณ„์˜ ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ํ†ตํ•ด ๋ฌด์—‡์ด ์ž˜๋ชป๋˜์—ˆ๋Š”์ง€ ๋ฐํ˜€์งˆ ๊ฐ€๋Šฅ์„ฑ์ด ๋งค์šฐ ๋†’์Šต๋‹ˆ๋‹ค.

ํŒ

๋ณด๋‹ค ๋ณต์žกํ•œ ๋””๋ฒ„๊น…์˜ ์˜ˆ๋ฅผ ๋ณด์—ฌ์ฃผ๊ธฐ ์ „์— ํšจ๊ณผ์ ์ธ ์‚ฌ์šฉ์„ ์œ„ํ•œ ๋ช‡ ๊ฐ€์ง€ ์š”๋ น์„ ๋ณด์—ฌ ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. ์ถ”์ ํ•˜๋‹ค:

๋‚จ์ž๋Š” ๋„ค ์นœ๊ตฌ์•ผ

๋งŽ์€ *nix ์‹œ์Šคํ…œ์—์„œ ์ปค๋„์— ๋Œ€ํ•œ ์ „์ฒด ์‹œ์Šคํ…œ ํ˜ธ์ถœ ๋ชฉ๋ก์€ ๋‹ค์Œ์„ ์‹คํ–‰ํ•˜์—ฌ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚จ์ž ์‹œ์Šคํ…œ์ฝœ. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‚ด์šฉ์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. brk(2)์ด๋Š” ๋‹ค์Œ์„ ์‹คํ–‰ํ•˜์—ฌ ๋” ๋งŽ์€ ์ •๋ณด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋‚จ์ž 2brk.

์ž‘์€ ๊ฐˆํ€ด: ๋‚จ์ž 2 ํฌํฌ ์‰˜ ํŽ˜์ด์ง€๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค ํฌํฌ() ะฒ GNU libc, ์ด๋Š” ๋‹ค์Œ์„ ํ˜ธ์ถœํ•˜์—ฌ ๊ตฌํ˜„๋˜๋Š” ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. clone (). ํ˜ธ์ถœ ์˜๋ฏธ๋ก  ํฌํฌ ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๋ฉด ๋™์ผํ•˜๊ฒŒ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ํฌํฌ(), ์ถ”์ ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ „ํ™”๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํฌํฌ, ๊ทธ ๋Œ€์‹ ์— clone (). ์ด๋Ÿฌํ•œ ๊ฐˆํ€ด๋Š” ์†Œ์Šค์™€ ์ถœ๋ ฅ์„ ๋น„๊ตํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ํ˜ผ๋ž€์„ ์ค๋‹ˆ๋‹ค. ์ถ”์ ํ•˜๋‹ค.

-o๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ถœ๋ ฅ์„ ํŒŒ์ผ์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

์ถ”์ ํ•˜๋‹ค ๊ด‘๋ฒ”์œ„ํ•œ ์ถœ๋ ฅ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ถ”์  ๊ฒฐ๊ณผ๋ฅผ ๋ณ„๋„์˜ ํŒŒ์ผ์— ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด ์œ ์šฉํ•œ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค(์œ„์˜ ์˜ˆ ์ฐธ์กฐ). ์ด๋Š” ๋˜ํ•œ ํ”„๋กœ๊ทธ๋žจ ์ถœ๋ ฅ๊ณผ ์ถœ๋ ฅ์˜ ํ˜ผ๋™์„ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ์ถ”์ ํ•˜๋‹ค ์ฝ˜์†”์—์„œ.

๋” ๋งŽ์€ ์ธ์ˆ˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋ ค๋ฉด -s๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

์œ„์˜ ์˜ˆ์ œ ์ถ”์ ์—๋Š” ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€์˜ ํ›„๋ฐ˜๋ถ€๊ฐ€ ํ‘œ์‹œ๋˜์ง€ ์•Š์€ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ถ”์ ํ•˜๋‹ค ๊ธฐ๋ณธ๊ฐ’์€ ๋ฌธ์ž์—ด ์ธ์ˆ˜์˜ ์ฒ˜์Œ 32๋ฐ”์ดํŠธ๋งŒ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ๋” ๋ณด๊ณ  ์‹ถ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ถ”๊ฐ€ํ•˜์„ธ์š”. -s 128 ์ „ํ™”์— ์ถ”์ ํ•˜๋‹ค.

-y๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํŒŒ์ผ, ์†Œ์ผ“ ๋“ฑ์„ ๋” ์‰ฝ๊ฒŒ ์ถ”์ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

"All is file"์€ *nix ์‹œ์Šคํ…œ์ด ํŒŒ์ผ, ๋„คํŠธ์›Œํฌ ๋˜๋Š” ํ”„๋กœ์„ธ์Šค ๊ฐ„ ํŒŒ์ดํ”„์— ์ ์šฉ๋˜๋Š”์ง€ ์—ฌ๋ถ€์— ๊ด€๊ณ„์—†์ด ํŒŒ์ผ ์„ค๋ช…์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  I/O๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—๋Š” ํŽธ๋ฆฌํ•˜์ง€๋งŒ ์ผ๋ฐ˜์ ์ธ ๋‚ด์šฉ์„ ๋ณด๋ฉด ์‹ค์ œ๋กœ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€ ์ถ”์ ํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ์ฝ๊ธฐ ะธ ์“ฐ๋‹ค ์‹œ์Šคํ…œ ํ˜ธ์ถœ ์ถ”์  ๊ฒฐ๊ณผ์—์„œ.

์—ฐ์‚ฐ์ž๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ y, ๋‹น์‹ ์€ ๊ฐ•์ œ๋กœ ์ถ”์ ํ•˜๋‹ค ์ถœ๋ ฅ์˜ ๊ฐ ํŒŒ์ผ ์„ค๋ช…์ž์— ๊ทธ๊ฒƒ์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ๋‚ด์šฉ์„ ๊ธฐ๋กํ•ด ์ฃผ์„์„ ๋‹ต๋‹ˆ๋‹ค.

-p**๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฏธ ์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ์„ธ์Šค์— ์—ฐ๊ฒฐ

์•„๋ž˜ ์˜ˆ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด ๋•Œ๋กœ๋Š” ์ด๋ฏธ ์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ๊ทธ๋žจ์„ ์ถ”์ ํ•ด์•ผ ํ•  ๋•Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ์„ธ์Šค 1337๋กœ ์‹คํ–‰๋˜๊ณ  ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ์•Œ๋ ค์ง„ ๊ฒฝ์šฐ(์˜ˆ: ์ถœ๋ ฅ์—์„œ ps), ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ถ”์ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

$ strace -p 1337
...system call trace output...

๋ฃจํŠธ ๊ถŒํ•œ์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์œ„ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋ ค๋ฉด -f๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

์ถ”์ ํ•˜๋‹ค ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค๋งŒ ์ถ”์ ํ•ฉ๋‹ˆ๋‹ค. ์ด ํ”„๋กœ์„ธ์Šค๊ฐ€ ํ•˜์œ„ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒฝ์šฐ ํ•˜์œ„ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ๋ณผ ์ˆ˜ ์žˆ์ง€๋งŒ ํ•˜์œ„ ํ”„๋กœ์„ธ์Šค์˜ ์‹œ์Šคํ…œ ํ˜ธ์ถœ์€ ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์˜ค๋ฅ˜๊ฐ€ ํ•˜์œ„ ํ”„๋กœ์„ธ์Šค์— ์žˆ๋‹ค๊ณ  ์ƒ๊ฐ๋˜๋ฉด ๋‹ค์Œ ๋ช…๋ น๋ฌธ์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. -f, ๊ทธ๋Ÿฌ๋ฉด ์ถ”์ ์ด ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์˜ ๋‹จ์ ์€ ์ถœ๋ ฅ์ด ๋‹น์‹ ์„ ๋”์šฑ ํ˜ผ๋ž€์Šค๋Ÿฝ๊ฒŒ ํ•  ๊ฒƒ์ด๋ผ๋Š” ์ ์ž…๋‹ˆ๋‹ค. ์–ธ์ œ ์ถ”์ ํ•˜๋‹ค ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค๋‚˜ ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ๋ฅผ ์ถ”์ ํ•˜๋ฉด ํ˜ธ์ถœ ์ด๋ฒคํŠธ์˜ ๋‹จ์ผ ์ŠคํŠธ๋ฆผ์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ํ•œ ๋ฒˆ์— ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ถ”์ ํ•  ๋•Œ ๋ฉ”์‹œ์ง€๋กœ ์ธํ•ด ํ˜ธ์ถœ์ด ์ค‘๋‹จ๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. , ๊ทธ๋Ÿฐ ๋‹ค์Œ - ๋‹ค๋ฅธ ์‹คํ–‰ ๋ถ„๊ธฐ์— ๋Œ€ํ•œ ์—ฌ๋Ÿฌ ํ˜ธ์ถœ, ๊ทธ๋ฆฌ๊ณ  ๋‚˜์„œ์•ผ - ์ฒซ ๋ฒˆ์งธ ๋ถ„๊ธฐ์˜ ๋ <โ€ฆํ‘ธ์ฝœ ์žฌ๊ฐœ>. ๋˜๋Š” ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  ์ถ”์  ๊ฒฐ๊ณผ๋ฅผ ๋‹ค๋ฅธ ํŒŒ์ผ๋กœ ๋ถ„ํ• ํ•ฉ๋‹ˆ๋‹ค. -ff (์ž์„ธํ•œ ๋‚ด์šฉ์€ ์•ˆ๋‚ด์„œ ์— ์ถ”์ ํ•˜๋‹ค).

-e๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ถ”์  ํ•„ํ„ฐ๋ง

๋ณด์‹œ๋‹ค์‹œํ”ผ ์ถ”์  ๊ฒฐ๊ณผ๋Š” ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์‹œ์Šคํ…œ ํ˜ธ์ถœ์˜ ์‹ค์ œ ๋”๋ฏธ์ž…๋‹ˆ๋‹ค. ๊นƒ๋ฐœ -e ์ถ”์ ์„ ํ•„ํ„ฐ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์ฐธ์กฐ: ์ง€๋„๋ ฅ ์— ์ถ”์ ํ•˜๋‹ค). ๊ฐ€์žฅ ํฐ ์žฅ์ ์€ ์ „์ฒด ์ถ”์ ์„ ์ˆ˜ํ–‰ํ•œ ๋‹ค์Œ ํ•„ํ„ฐ๋ง๋œ ์ถ”์ ์„ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ๋น ๋ฅด๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. GREP`์—. ์†”์งํžˆ ๋งํ•ด์„œ ๋‚˜๋Š” ๊ฑฐ์˜ ํ•ญ์ƒ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  ์‹ค์ˆ˜๊ฐ€ ๋‚˜์œ ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค

๊ฐ„๋‹จํ•˜๊ณ  ์ผ๋ฐ˜์ ์ธ ์˜ˆ๋Š” ์‹คํ–‰ ํŒŒ์ผ์ด ํฌํ•จ๋œ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์ฐพ๋Š” ์…ธ๊ณผ ๊ฐ™์ด ํ•œ ๋ฒˆ์— ์—ฌ๋Ÿฌ ์œ„์น˜์—์„œ ํŒŒ์ผ์„ ์ฐพ๋Š” ํ”„๋กœ๊ทธ๋žจ์ž…๋‹ˆ๋‹ค.

$ strace sh -c uname
...
stat("/home/user/bin/uname", 0x7ffceb817820) = -1 ENOENT (No such file or directory)
stat("/usr/local/bin/uname", 0x7ffceb817820) = -1 ENOENT (No such file or directory)
stat("/usr/bin/uname", {st_mode=S_IFREG|0755, st_size=39584, ...}) = 0
...

"์˜ค๋ฅ˜๋ฅผ ๋ณด๊ณ ํ•˜๊ธฐ ์ „ ๋งˆ์ง€๋ง‰์œผ๋กœ ์‹คํŒจํ•œ ์š”์ฒญ"๊ณผ ๊ฐ™์€ ๊ฒฝํ—˜์  ๋ฐฉ๋ฒ•์€ ๊ด€๋ จ ์˜ค๋ฅ˜๋ฅผ ์ฐพ๋Š” ๋ฐ ์ข‹์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋”๋ผ๋„ ๋งจ ๋๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ด ๋…ผ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค.

C ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŠœํ† ๋ฆฌ์–ผ์€ ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ์ดํ•ดํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

C ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•œ ํ‘œ์ค€ ํ˜ธ์ถœ์€ ์‹œ์Šคํ…œ ํ˜ธ์ถœ์ด ์•„๋‹ˆ๋ผ ์–‡์€ ํ‘œ๋ฉด ๊ณ„์ธต์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ C์—์„œ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ์ž‘์—…์„ ์กฐ๊ธˆ์ด๋ผ๋„ ์ดํ•ดํ•˜๋ฉด ์‹œ์Šคํ…œ ํ˜ธ์ถœ ์ถ”์  ๊ฒฐ๊ณผ๋ฅผ ์ดํ•ดํ•˜๊ธฐ๊ฐ€ ๋” ์‰ฌ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋„คํŠธ์›Œํฌ ์‹œ์Šคํ…œ์— ๋Œ€ํ•œ ํ˜ธ์ถœ์„ ๋””๋ฒ„๊น…ํ•˜๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ๋™์ผํ•œ ํด๋ž˜์‹ Bija์˜ ๋„คํŠธ์›Œํฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ฐ€์ด๋“œ.

๋” ๋ณต์žกํ•œ ๋””๋ฒ„๊น… ์˜ˆ์ œ

๊ฐ„๋‹จํ•œ ๋””๋ฒ„๊น…์˜ ์˜ˆ๋Š” ์ œ๊ฐ€ ์ž‘์—…ํ•  ๋•Œ ์ฃผ๋กœ ๋‹ค๋ค„์•ผ ํ•  ์ผ์˜ ์˜ˆ๋ผ๊ณ  ์ด๋ฏธ ๋ง์”€๋“œ๋ ธ์Šต๋‹ˆ๋‹ค. ์ถ”์ ํ•˜๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์‹ค์ œ ์กฐ์‚ฌ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ๋„ ์žˆ์œผ๋ฏ€๋กœ ๋‹ค์Œ์€ ๊ณ ๊ธ‰ ๋””๋ฒ„๊น…์˜ ์‹ค์ œ ์˜ˆ์ž…๋‹ˆ๋‹ค.

๋ธŒ๋ก  - ์ž‘์—… ์ฒ˜๋ฆฌ ์Šค์ผ€์ค„๋Ÿฌ, *nix ๋ฐ๋ชฌ์˜ ๋˜ ๋‹ค๋ฅธ ๊ตฌํ˜„ ํฌ๋ก . ์„œ๋ฒ„์— ์„ค์น˜๋˜์–ด ์žˆ์ง€๋งŒ ๋ˆ„๊ตฐ๊ฐ€ ์ผ์ •์„ ํŽธ์ง‘ํ•˜๋ ค๊ณ  ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ผ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

# crontab -e -u logs
bcrontab: Fatal: Could not create temporary file

์•Œ์•˜์–ด, ๊ทธ ๋ง์€ ๋ธŒ๋ก  ํŠน์ • ํŒŒ์ผ์„ ์ž‘์„ฑํ•˜๋ ค๊ณ  ํ–ˆ์ง€๋งŒ ์ž‘๋™ํ•˜์ง€ ์•Š์•˜๊ณ  ๊ทธ ์ด์œ ๋ฅผ ์ธ์ •ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋ฐœ๊ฒฌ ์ถ”์ ํ•˜๋‹ค:

# strace -o /tmp/trace crontab -e -u logs
bcrontab: Fatal: Could not create temporary file
# cat /tmp/trace
...
openat(AT_FDCWD, "bcrontab.14779.1573691864.847933", O_RDONLY) = 3
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f82049b4000
read(3, "#Ansible: logsaggn20 14 * * * lo"..., 8192) = 150
read(3, "", 8192)                       = 0
munmap(0x7f82049b4000, 8192)            = 0
close(3)                                = 0
socket(AF_UNIX, SOCK_STREAM, 0)         = 3
connect(3, {sa_family=AF_UNIX, sun_path="/var/run/bcron-spool"}, 110) = 0
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f82049b4000
write(3, "156:Slogs #Ansible: logsaggn20 1"..., 161) = 161
read(3, "32:ZCould not create temporary f"..., 8192) = 36
munmap(0x7f82049b4000, 8192)            = 0
close(3)                                = 0
write(2, "bcrontab: Fatal: Could not creat"..., 49) = 49
unlink("bcrontab.14779.1573691864.847933") = 0
exit_group(111)                         = ?
+++ exited with 111 +++

๋งˆ์ง€๋ง‰ ๋ถ€๋ถ„์— ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์“ฐ๋‹ค, ํ•˜์ง€๋งŒ ์ด๋ฒˆ์—๋Š” ๋ญ”๊ฐ€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์ฒซ์งธ, ์ผ๋ฐ˜์ ์œผ๋กœ ์ด ์ „์— ๋ฐœ์ƒํ•˜๋Š” ๊ด€๋ จ ์‹œ์Šคํ…œ ํ˜ธ์ถœ ์˜ค๋ฅ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋‘˜์งธ, ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ด๋ฏธ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ์ฝ์—ˆ์Œ์ด ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์ง„์งœ ๋ฌธ์ œ๋Š” ๋‹ค๋ฅธ ๋ฐ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์€๋ฐ, ๋ธŒ๋ก ํƒญ ๋‹จ์ˆœํžˆ ๋ฉ”์‹œ์ง€๋ฅผ ์žฌ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋ณด๋‹ˆ ๋‚จ์ž 2 ์ฝ๋‹ค, ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜(3)๋Š” *nix๊ฐ€ ๋ชจ๋“  I/O ์ฒ˜๋ฆฌ์— ์‚ฌ์šฉํ•˜๋Š” ํŒŒ์ผ ์„ค๋ช…์ž์ž„์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŒŒ์ผ ์„ค๋ช…์ž 3์ด ๋ฌด์—‡์„ ๋‚˜ํƒ€๋‚ด๋Š”์ง€ ์–ด๋–ป๊ฒŒ ์•Œ ์ˆ˜ ์žˆ๋‚˜์š”? ์ด ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ์—๋Š” ๋‹ค์Œ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ถ”์ ํ•˜๋‹ค ั ์ž‘์—… y (์œ„ ์ฐธ์กฐ) ์ž๋™์œผ๋กœ ์•Œ๋ ค ์ฃผ์ง€๋งŒ ์ด์™€ ๊ฐ™์€ ๋‚ด์šฉ์„ ํŒŒ์•…ํ•˜๋ ค๋ฉด ์ถ”์  ๊ฒฐ๊ณผ๋ฅผ ์ฝ๊ณ  ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•„๋Š” ๊ฒƒ์ด ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

ํŒŒ์ผ ์„ค๋ช…์ž์˜ ์†Œ์Šค๋Š” ๋งŽ์€ ์‹œ์Šคํ…œ ํ˜ธ์ถœ ์ค‘ ํ•˜๋‚˜์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๋ชจ๋‘ ์„ค๋ช…์ž์˜ ์šฉ๋„์— ๋”ฐ๋ผ ๋‹ค๋ฆ„ - ์ฝ˜์†”, ๋„คํŠธ์›Œํฌ ์†Œ์ผ“, ํŒŒ์ผ ์ž์ฒด ๋˜๋Š” ๊ธฐํƒ€). ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๋Ÿด ์ˆ˜๋„ ์žˆ์œผ๋ฏ€๋กœ ์šฐ๋ฆฌ๋Š” ๋‹ค์Œ์„ ์ฐพ์Šต๋‹ˆ๋‹ค. 3์„ ๋ฐ˜ํ™˜ํ•˜์—ฌ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค(์ฆ‰, ์ถ”์  ๊ฒฐ๊ณผ์—์„œ "= 3"์„ ์ฐพ์Šต๋‹ˆ๋‹ค). ์ด ๊ฒฐ๊ณผ์—๋Š” 2๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ด๊ธฐ ๋งจ ๊ผญ๋Œ€๊ธฐ์— ๊ทธ๋ฆฌ๊ณ  ์†Œ์ผ“ ์ค‘๊ฐ„์—. ์—ด๊ธฐ ํŒŒ์ผ์„ ์—ด์ง€๋งŒ ๊ฐ€๊นŒ์šด(3)์€ ๋‹ค์‹œ ๋‹ซํžˆ๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. (Rake: ํŒŒ์ผ ์„ค๋ช…์ž๋ฅผ ์—ด๊ณ  ๋‹ซ์„ ๋•Œ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.) ๋ถ€๋ฅด๋‹ค ์†Œ์ผ“() ์ „ ๋งˆ์ง€๋ง‰์ด๋‹ˆ๊นŒ ์ ๋‹นํ•ด ์ฝ๋‹ค(), bcrontab์€ ์†Œ์ผ“์„ ํ†ตํ•ด ๋ฌด์–ธ๊ฐ€์™€ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ์ค„์€ ํŒŒ์ผ ์„ค๋ช…์ž๊ฐ€ ๋‹ค์Œ๊ณผ ์—ฐ๊ด€๋˜์–ด ์žˆ์Œ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์œ ๋‹‰์Šค ๋„๋ฉ”์ธ ์†Œ์ผ“ ๋„์ค‘์— /var/run/bcron-์Šคํ’€.

๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ด€๋ จ๋œ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ฐพ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์œ ๋‹‰์Šค ์†Œ์ผ“ ๋ฐ˜๋Œ€ํŽธ์—. ์ด ๋ชฉ์ ์„ ์œ„ํ•œ ๋ช‡ ๊ฐ€์ง€ ์œ ์šฉํ•œ ๋ฐฉ๋ฒ•์ด ์žˆ์œผ๋ฉฐ ๋‘˜ ๋‹ค ์„œ๋ฒ„ ๋ฐฐํฌ ๋””๋ฒ„๊น…์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ๋Š” ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. NETSTAT ๋˜๋Š” ์ตœ์‹  ss (์†Œ์ผ“ ์ƒํƒœ). ๋‘ ๋ช…๋ น ๋ชจ๋‘ ์‹œ์Šคํ…œ์˜ ํ™œ์„ฑ ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ์„ ํ‘œ์‹œํ•˜๊ณ  ๋‹ค์Œ ๋ช…๋ น๋ฌธ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. -l ์ฒญ์ทจ ์†Œ์ผ“๊ณผ ์—ฐ์‚ฐ์ž๋ฅผ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•ด -p ํด๋ผ์ด์–ธํŠธ๋กœ ์†Œ์ผ“์— ์—ฐ๊ฒฐ๋œ ํ”„๋กœ๊ทธ๋žจ์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. (๋” ๋งŽ์€ ์œ ์šฉํ•œ ์˜ต์…˜์ด ์žˆ์ง€๋งŒ ์ด ์ž‘์—…์—๋Š” ์ด ๋‘ ๊ฐ€์ง€๋งŒ์œผ๋กœ ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.)

# ss -pl | grep /var/run/bcron-spool
u_str LISTEN 0   128   /var/run/bcron-spool 1466637   * 0   users:(("unixserver",pid=20629,fd=3))

์ด๋Š” ์ฒญ์ทจ์ž๊ฐ€ ๋ช…๋ น์ž„์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. inix์„œ๋ฒ„, ํ”„๋กœ์„ธ์Šค ID 20629๋กœ ์‹คํ–‰ ์ค‘์ž…๋‹ˆ๋‹ค. (๊ทธ๋ฆฌ๊ณ  ๊ณต๊ต๋กญ๊ฒŒ๋„ ํŒŒ์ผ ์„ค๋ช…์ž 3์„ ์†Œ์ผ“์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.)

๋™์ผํ•œ ์ •๋ณด๋ฅผ ์ฐพ๋Š” ๋ฐ ์ •๋ง ์œ ์šฉํ•œ ๋‘ ๋ฒˆ์งธ ๋„๊ตฌ๋Š” ์ด์†Œํ”„. ์‹œ์Šคํ…œ์— ์—ด๋ ค ์žˆ๋Š” ๋ชจ๋“  ํŒŒ์ผ(๋˜๋Š” ํŒŒ์ผ ์„ค๋ช…์ž)์ด ๋‚˜์—ด๋ฉ๋‹ˆ๋‹ค. ๋˜๋Š” ํ•˜๋‚˜์˜ ํŠน์ • ํŒŒ์ผ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

# lsof /var/run/bcron-spool
COMMAND   PID   USER  FD  TYPE  DEVICE              SIZE/OFF  NODE    NAME
unixserve 20629 cron  3u  unix  0x000000005ac4bd83  0t0       1466637 /var/run/bcron-spool type=STREAM

ํ”„๋กœ์„ธ์Šค 20629๋Š” ์ˆ˜๋ช…์ด ๊ธด ์„œ๋ฒ„์ด๋ฏ€๋กœ ๋‹ค์Œ์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ถ”์ ํ•˜๋‹ค ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ์‚ฌ์šฉํ•˜์—ฌ strace -o /tmp/์ถ”์  -p 20629. ๋‹ค๋ฅธ ํ„ฐ๋ฏธ๋„์—์„œ cron ์ž‘์—…์„ ํŽธ์ง‘ํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ์žˆ๋Š” ์ถ”์  ์ถœ๋ ฅ์„ ๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

accept(3, NULL, NULL)                   = 4
clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7faa47c44810) = 21181
close(4)                                = 0
accept(3, NULL, NULL)                   = ? ERESTARTSYS (To be restarted if SA_RESTART is set)
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=21181, si_uid=998, si_status=0, si_utime=0, si_stime=0} ---
wait4(0, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], WNOHANG|WSTOPPED, NULL) = 21181
wait4(0, 0x7ffe6bc36764, WNOHANG|WSTOPPED, NULL) = -1 ECHILD (No child processes)
rt_sigaction(SIGCHLD, {sa_handler=0x55d244bdb690, sa_mask=[CHLD], sa_flags=SA_RESTORER|SA_RESTART, sa_restorer=0x7faa47ab9840}, {sa_handler=0x55d244bdb690, sa_mask=[CHLD], sa_flags=SA_RESTORER|SA_RESTART, sa_restorer=0x7faa47ab9840}, 8) = 0
rt_sigreturn({mask=[]})                 = 43
accept(3, NULL, NULL)                   = 4
clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7faa47c44810) = 21200
close(4)                                = 0
accept(3, NULL, NULL)                   = ? ERESTARTSYS (To be restarted if SA_RESTART is set)
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=21200, si_uid=998, si_status=111, si_utime=0, si_stime=0} ---
wait4(0, [{WIFEXITED(s) && WEXITSTATUS(s) == 111}], WNOHANG|WSTOPPED, NULL) = 21200
wait4(0, 0x7ffe6bc36764, WNOHANG|WSTOPPED, NULL) = -1 ECHILD (No child processes)
rt_sigaction(SIGCHLD, {sa_handler=0x55d244bdb690, sa_mask=[CHLD], sa_flags=SA_RESTORER|SA_RESTART, sa_restorer=0x7faa47ab9840}, {sa_handler=0x55d244bdb690, sa_mask=[CHLD], sa_flags=SA_RESTORER|SA_RESTART, sa_restorer=0x7faa47ab9840}, 8) = 0
rt_sigreturn({mask=[]})                 = 43
accept(3, NULL, NULL

(๋งˆ์ง€๋ง‰ ์ˆ˜์šฉํ•˜๋‹ค() ์ถ”์  ์‹œ ์™„๋ฃŒ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.) ์•ˆํƒ€๊น๊ฒŒ๋„ ์ด ๊ฒฐ๊ณผ์—๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ฐพ๊ณ  ์žˆ๋Š” ์˜ค๋ฅ˜๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. bcrontag๊ฐ€ ์†Œ์ผ“์œผ๋กœ ๋ณด๋‚ด๊ฑฐ๋‚˜ ์†Œ์ผ“์—์„œ ๋ฐ›๋Š” ๋ฉ”์‹œ์ง€๋Š” ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  ์™„์ „ํ•œ ํ”„๋กœ์„ธ์Šค ์ œ์–ด(๋ณต์ œ, ๊ธฐ๋‹ค๋ฆผ4, SIGCHLD ๋“ฑ) ์ด ํ”„๋กœ์„ธ์Šค๋Š” ์ง์ž‘ํ•  ์ˆ˜ ์žˆ๋“ฏ์ด ์‹ค์ œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ํ•˜์œ„ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๋…€์˜ ํ”์ ์„ ๋”ฐ๋ผ์žก์•„์•ผ ํ•œ๋‹ค๋ฉด ํ†ตํ™”์— ์ถ”๊ฐ€ํ•˜์„ธ์š” ์ถ”์  -f. ์ด๊ฒƒ์€ strace๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ ๊ฒฐ๊ณผ์—์„œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ๊ฒ€์ƒ‰ํ•  ๋•Œ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. -f -o /tmp/์ถ”์  -p 20629:

21470 openat(AT_FDCWD, "tmp/spool.21470.1573692319.854640", O_RDWR|O_CREAT|O_EXCL, 0600) = -1 EACCES (Permission denied) 
21470 write(1, "32:ZCould not create temporary f"..., 36) = 36
21470 write(2, "bcron-spool[21470]: Fatal: logs:"..., 84) = 84
21470 unlink("tmp/spool.21470.1573692319.854640") = -1 ENOENT (No such file or directory)
21470 exit_group(111)                   = ?
21470 +++ exited with 111 +++

์ž, ๊ทธ๊ฒŒ ๋ญ”๊ฐ€์š”. ๊ฒฝ๋กœ์— ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๋ ค๊ณ  ํ•˜๋ฉด ํ”„๋กœ์„ธ์Šค 21470์—์„œ "์•ก์„ธ์Šค ๊ฑฐ๋ถ€" ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. tmp/spool.21470.1573692319.854640 (ํ˜„์žฌ ์ž‘์—… ๋””๋ ‰ํ† ๋ฆฌ์™€ ๊ด€๋ จ๋จ) ํ˜„์žฌ ์ž‘์—… ๋””๋ ‰ํ† ๋ฆฌ๋งŒ ์•Œ๊ณ  ์žˆ๋‹ค๋ฉด ์ „์ฒด ๊ฒฝ๋กœ๋„ ์•Œ๊ณ  ํ”„๋กœ์„ธ์Šค๊ฐ€ ํ•ด๋‹น ๋””๋ ‰ํ† ๋ฆฌ์— ์ž„์‹œ ํŒŒ์ผ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์—†๋Š” ์ด์œ ๋ฅผ ์•Œ์•„๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„์‰ฝ๊ฒŒ๋„ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ด๋ฏธ ์ข…๋ฃŒ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ƒฅ ์‚ฌ์šฉํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. lsof -p 21470 ํ˜„์žฌ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์ฐพ์œผ๋ ค๋ฉด ๋ฐ˜๋Œ€ ๋ฐฉํ–ฅ์œผ๋กœ ์ž‘์—…ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” PID 21470 ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ์ฐพ์œผ์„ธ์š”. (์•„๋ฌด๊ฒƒ๋„ ์—†์œผ๋ฉด PID 21470์€ ๋ถ€๋ชจ๋กœ๋ถ€ํ„ฐ ์ƒ์†๋ฐ›์•˜์Œ์— ํ‹€๋ฆผ์—†์œผ๋ฉฐ ์ด๋Š” ์ด๋ฏธ ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. lsof -p ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.) ์ด ์‹œ์Šคํ…œ ํ˜ธ์ถœ์€ chdir (์ตœ์‹  ์˜จ๋ผ์ธ ๊ฒ€์ƒ‰ ์—”์ง„์˜ ๋„์›€์œผ๋กœ ์‰ฝ๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค). ๋‹ค์Œ์€ ์ถ”์  ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์„œ๋ฒ„ PID 20629๊นŒ์ง€ ์—ญ๋ฐฉํ–ฅ ๊ฒ€์ƒ‰ํ•œ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค.

20629 clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7faa47c44810) = 21470
...
21470 execve("/usr/sbin/bcron-spool", ["bcron-spool"], 0x55d2460807e0 /* 27 vars */) = 0
...
21470 chdir("/var/spool/cron")          = 0
...
21470 openat(AT_FDCWD, "tmp/spool.21470.1573692319.854640", O_RDWR|O_CREAT|O_EXCL, 0600) = -1 EACCES (Permission denied) 
21470 write(1, "32:ZCould not create temporary f"..., 36) = 36
21470 write(2, "bcron-spool[21470]: Fatal: logs:"..., 84) = 84
21470 unlink("tmp/spool.21470.1573692319.854640") = -1 ENOENT (No such file or directory)
21470 exit_group(111)                   = ?
21470 +++ exited with 111 +++

(๊ธธ์„ ์žƒ์œผ์‹  ๋ถ„๋“ค์€ ์ด์ „ ํฌ์ŠคํŒ…์„ ์ฝ์–ด๋ณด์‹œ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. *nix ํ”„๋กœ์„ธ์Šค ๊ด€๋ฆฌ ๋ฐ ์‰˜ ์ •๋ณด.) ๋”ฐ๋ผ์„œ ์„œ๋ฒ„ PID 20629๋Š” ํ•ด๋‹น ๊ฒฝ๋กœ์— ํŒŒ์ผ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ์„ ๋ฐ›์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. /var/spool/cron/tmp/spool.21470.1573692319.854640. ์•„๋งˆ๋„ ๊ทธ ์ด์œ ๋Š” ํด๋ž˜์‹ ํŒŒ์ผ ์‹œ์Šคํ…œ ๊ถŒํ•œ ์„ค์ • ๋•Œ๋ฌธ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ ๊ฒ€ ํ•ด๋ณด์ž:

# ls -ld /var/spool/cron/tmp/
drwxr-xr-x 2 root root 4096 Nov  6 05:33 /var/spool/cron/tmp/
# ps u -p 20629
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
cron     20629  0.0  0.0   2276   752 ?        Ss   Nov14   0:00 unixserver -U /var/run/bcron-spool -- bcron-spool

๊ฐœ๊ฐ€ ๋ฌปํ˜€ ์žˆ๋Š” ๊ณณ์ด์—์š”! ์„œ๋ฒ„๋Š” ์‚ฌ์šฉ์ž cron์œผ๋กœ ์‹คํ–‰๋˜์ง€๋งŒ ๋ฃจํŠธ๋งŒ ๋””๋ ‰ํ† ๋ฆฌ์— ์“ธ ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ์ด ์žˆ์Šต๋‹ˆ๋‹ค. /var/spool/cron/tmp/. ๊ฐ„๋‹จํ•œ ๋ช…๋ น chown cron /var/spool/cron/tmp/ ํ•  ๊ฒƒ ๋ธŒ๋ก  ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘๋™ํ•˜์‹ญ์‹œ์˜ค. (๋งŒ์•ฝ ๊ทธ๊ฒƒ์ด ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ์—ˆ๋‹ค๋ฉด ๋‹ค์Œ์œผ๋กœ ์˜์‹ฌ๋˜๋Š” ๊ฒƒ์€ SELinux ๋˜๋Š” AppArmor์™€ ๊ฐ™์€ ์ปค๋„ ๋ณด์•ˆ ๋ชจ๋“ˆ์ด๋ฏ€๋กœ ๋‹ค์Œ์œผ๋กœ ์ปค๋„ ๋ฉ”์‹œ์ง€ ๋กœ๊ทธ๋ฅผ ํ™•์ธํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. dmesg์—.)

์ „์ฒด๋กœ

์‹œ์Šคํ…œ ํ˜ธ์ถœ ์ถ”์ ์€ ์ดˆ๋ณด์ž์—๊ฒŒ ๋ถ€๋‹ด์Šค๋Ÿฌ์šธ ์ˆ˜ ์žˆ์ง€๋งŒ ์ด๊ฒƒ์ด ์ผ๋ฐ˜์ ์ธ ๋ฐฐํฌ ๋ฌธ์ œ ์ „์ฒด๋ฅผ ๋””๋ฒ„๊ทธํ•˜๋Š” ๋น ๋ฅธ ๋ฐฉ๋ฒ•์ด๋ผ๋Š” ์ ์„ ๋ณด์—ฌ์ฃผ์—ˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๋‹ค์ค‘ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋””๋ฒ„๊น…ํ•˜๋ ค๊ณ  ํ•œ๋‹ค๊ณ  ์ƒ์ƒํ•ด ๋ณด์„ธ์š”. ๋ธŒ๋ก ๋‹จ๊ณ„๋ณ„ ๋””๋ฒ„๊ฑฐ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ผ๋ จ์˜ ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ๋”ฐ๋ผ ์—ญ๋ฐฉํ–ฅ์œผ๋กœ ์ถ”์  ๊ฒฐ๊ณผ๋ฅผ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๋ ค๋ฉด ๊ธฐ์ˆ ์ด ํ•„์š”ํ•˜์ง€๋งŒ ์•ž์„œ ๋งํ–ˆ๋“ฏ์ด ๊ฑฐ์˜ ํ•ญ์ƒ ๋‹ค์Œ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ถ”์ ํ•˜๋‹ค, ์ถ”์  ๊ฒฐ๊ณผ๋ฅผ ์–ป๊ณ  ๋๋ถ€ํ„ฐ ์˜ค๋ฅ˜๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„, ์ถ”์ ํ•˜๋‹ค ๋””๋ฒ„๊น…์— ๋งŽ์€ ์‹œ๊ฐ„์„ ์ ˆ์•ฝํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๋‹น์‹ ์—๊ฒŒ๋„ ์œ ์šฉํ•  ๊ฒƒ์ด๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€