ืื™ืชื•ืจ ื‘ืื’ื™ื ื‘ืคืจื™ืกืช ืชื•ื›ื ื” ืขื strace

ืื™ืชื•ืจ ื‘ืื’ื™ื ื‘ืคืจื™ืกืช ืชื•ื›ื ื” ืขื strace

ื”ืขื‘ื•ื“ื” ื”ื™ื•ื ืฉืœื™ ื”ื™ื ื‘ืขื™ืงืจ ืคืจื™ืกืช ืชื•ื›ื ื”, ืžื” ืฉืื•ืžืจ ืฉืื ื™ ืžื‘ืœื” ื”ืจื‘ื” ื–ืžืŸ ื‘ื ื™ืกื™ื•ืŸ ืœืขื ื•ืช ืขืœ ืฉืืœื•ืช ื›ืžื•:

  • ื”ืชื•ื›ื ื” ื”ื–ื• ืขื•ื‘ื“ืช ืขื‘ื•ืจ ื”ืžืคืชื—, ืื‘ืœ ืœื ืขื‘ื•ืจื™. ืœืžื”?
  • ืืชืžื•ืœ ื”ืชื•ื›ื ื” ื”ื–ื• ืขื‘ื“ื” ื‘ืฉื‘ื™ืœื™, ืื‘ืœ ื”ื™ื•ื ื–ื” ืœื. ืœืžื”?

ื–ื”ื• ืกื•ื’ ืฉืœ ืื™ืชื•ืจ ื‘ืื’ื™ื ื”ืฉื•ื ื” ื‘ืžืงืฆืช ืžืื™ืชื•ืจ ื‘ืื’ื™ื ืจื’ื™ืœ ื‘ืชื•ื›ื ื”. ืื™ืชื•ืจ ื‘ืื’ื™ื ืจื’ื™ืœ ืขื•ืกืง ื‘ื”ื™ื’ื™ื•ืŸ ืฉืœ ื”ืงื•ื“, ืื‘ืœ ืื™ืชื•ืจ ื‘ืื’ื™ื ื‘ืคืจื™ืกื” ืขื•ืกืง ื‘ืื™ื ื˜ืจืืงืฆื™ื” ื‘ื™ืŸ ื”ืงื•ื“ ืœืกื‘ื™ื‘ื”. ื’ื ืื ืฉื•ืจืฉ ื”ื‘ืขื™ื” ื”ื•ื ืฉื’ื™ืื” ืœื•ื’ื™ืช, ื”ืขื•ื‘ื“ื” ืฉื”ื›ืœ ืขื•ื‘ื“ ืขืœ ืžื›ื•ื ื” ืื—ืช ื•ืœื ืขืœ ืื—ืจืช ืื•ืžืจืช ืฉื”ื‘ืขื™ื” ื”ื™ื ืื™ื›ืฉื”ื• ื‘ืกื‘ื™ื‘ื”.

ืื– ื‘ืžืงื•ื ื›ืœื™ ื ื™ืคื•ื™ ื‘ืื’ื™ื ื”ืจื’ื™ืœื™ื ื›ืžื• gdb ื™ืฉ ืœื™ ืกื˜ ืื—ืจ ืฉืœ ื›ืœื™ื ืœืคืจื™ืกืช ื ื™ืคื•ื™ ื‘ืื’ื™ื. ื•ื”ื›ืœื™ ื”ืื”ื•ื‘ ืขืœื™ ืœื”ืชืžื•ื“ื“ื•ืช ืขื ื”ื‘ืขื™ื” ื›ืžื• "ืœืžื” ื”ืชื•ื›ื ื” ื”ื–ื• ืœื ืขื•ื‘ื“ืช ื‘ืฉื‘ื™ืœื™?" ืฉืงื•ืจืื™ื ืœื• ืฉื˜ืจืก.

ืžื” ื–ื” ืกื˜ืจืืก?

ืฉื˜ืจืก ื”ื•ื ื›ืœื™ ืœ"ืžืขืงื‘ ืื—ืจ ืฉื™ื—ื•ืช ืžืขืจื›ืช". ื–ื” ื ื•ืฆืจ ื‘ืžืงื•ืจ ืขื‘ื•ืจ ืœื™ื ื•ืงืก, ืื‘ืœ ืืช ืื•ืชื ื˜ืจื™ืงื™ื ื‘ืื’ื™ื ื ื™ืชืŸ ืœืขืฉื•ืช ืขื ื›ืœื™ื ืขื‘ื•ืจ ืžืขืจื›ื•ืช ืื—ืจื•ืช (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 ืขื‘ื•ืจ ืœื™ื‘ืช ืžืขืจื›ืช ื”ื”ืคืขืœื”. ืคืขื, ืœืชื•ื›ื ื” ื”ื™ื™ืชื” ื’ื™ืฉื” ื™ืฉื™ืจื” ืœื—ื•ืžืจื” ืฉื”ื™ื ืจืฆื” ืขืœื™ื”. ืื, ืœืžืฉืœ, ื”ื•ื ื”ื™ื” ืฆืจื™ืš ืœื”ืฆื™ื’ ืžืฉื”ื• ืขืœ ื”ืžืกืš, ื”ื•ื ืฉื™ื—ืง ืขื ื™ืฆื™ืื•ืช ืื• ืื•ื’ืจื™ื ืžืžื•ืคื™ ื–ื™ื›ืจื•ืŸ ืขื‘ื•ืจ ื”ืชืงื ื™ ื•ื™ื“ืื•. ื›ืืฉืจ ืžืขืจื›ื•ืช ืžื—ืฉื‘ ืจื™ื‘ื•ื™ ืžืฉื™ืžื•ืช ื”ืคื›ื• ืคื•ืคื•ืœืจื™ื•ืช, ื›ืื•ืก ืฉืœื˜ ื›ืืฉืจ ื™ื™ืฉื•ืžื™ื ืฉื•ื ื™ื ื ืœื—ืžื• ืขืœ ื”ื—ื•ืžืจื”. ืฉื’ื™ืื•ืช ื‘ื™ื™ืฉื•ื ืื—ื“ ืขืœื•ืœื•ืช ืœื”ืคื™ืœ ืื—ืจื™ื, ืื ืœื ืืช ื”ืžืขืจื›ืช ื›ื•ืœื”. ืื– ื”ื•ืคื™ืขื• ืžืฆื‘ื™ ื”ืจืฉืื•ืช (ืื• "ื”ื’ื ืช ื˜ื‘ืขืช") ื‘ืžืขื‘ื“. ื”ืงืจื ืœ ื”ืคืš ืœืžื™ื•ื—ืก ื‘ื™ื•ืชืจ: ื”ื•ื ืงื™ื‘ืœ ื’ื™ืฉื” ืžืœืื” ืœื—ื•ืžืจื”, ื•ื”ื•ืœื™ื“ ื™ื™ืฉื•ืžื™ื ืคื—ื•ืช ืžื™ื•ื—ืกื™ื ืฉื›ื‘ืจ ื”ื™ื• ืฆืจื™ื›ื™ื ืœื‘ืงืฉ ื’ื™ืฉื” ืžื”ืงืจื ืœ ื›ื“ื™ ืœืงื™ื™ื ืื™ื ื˜ืจืืงืฆื™ื” ืขื ื”ื—ื•ืžืจื” ื‘ืืžืฆืขื•ืช ืงืจื™ืื•ืช ืžืขืจื›ืช.

ื‘ืจืžื” ื”ื‘ื™ื ืืจื™ืช, ืงืจื™ืืช ืžืขืจื›ืช ืฉื•ื ื” ื‘ืžืงืฆืช ืžืงืจื™ืืช ืคื•ื ืงืฆื™ื” ืคืฉื•ื˜ื”, ืืš ืจื•ื‘ ื”ืชื•ื›ื ื•ืช ืžืฉืชืžืฉื•ืช ื‘ืžืขื˜ืคืช ื‘ืกืคืจื™ื™ื” ื”ืจื’ื™ืœื”. ื”ึธื”ึตืŸ. ื”ืกืคืจื™ื™ื” ื”ืกื˜ื ื“ืจื˜ื™ืช ืฉืœ POSIX C ืžื›ื™ืœื” ืงืจื™ืืช ืคื•ื ืงืฆื™ื” ืœึดื›ืชื•ึนื‘(), ื”ืžื›ื™ืœ ืืช ื›ืœ ื”ืงื•ื“ ื”ืกืคืฆื™ืคื™ ืœืืจื›ื™ื˜ืงื˜ื•ืจื” ืขื‘ื•ืจ ืงืจื™ืืช ื”ืžืขืจื›ืช ืœื›ืชื•ื‘.

ืื™ืชื•ืจ ื‘ืื’ื™ื ื‘ืคืจื™ืกืช ืชื•ื›ื ื” ืขื strace

ื‘ืงื™ืฆื•ืจ, ื›ืœ ืื™ื ื˜ืจืืงืฆื™ื” ื‘ื™ืŸ ืืคืœื™ืงืฆื™ื” ืœืกื‘ื™ื‘ืชื” (ืžืขืจื›ื•ืช ืžื—ืฉื•ื‘) ืžืชื‘ืฆืขืช ื‘ืืžืฆืขื•ืช ืงืจื™ืื•ืช ืžืขืจื›ืช. ืœื›ืŸ, ื›ืืฉืจ ืชื•ื›ื ื” ืขื•ื‘ื“ืช ืขืœ ืžื—ืฉื‘ ืื—ื“ ืืš ืœื ืขืœ ืื—ืจ, ื™ื”ื™ื” ื˜ื•ื‘ ืœื”ืกืชื›ืœ ืขืœ ืชื•ืฆืื•ืช ืžืขืงื‘ ืฉื™ื—ื•ืช ื”ืžืขืจื›ืช. ืœื™ืชืจ ื“ื™ื•ืง, ื”ื ื” ืจืฉื™ืžื” ืฉืœ ืจื’ืขื™ื ื˜ื™ืคื•ืกื™ื™ื ืฉื ื™ืชืŸ ืœื ืชื— ื‘ืืžืฆืขื•ืช ืžืขืงื‘ ืื—ืจ ืงืจื™ืืช ืžืขืจื›ืช:

  • ืงืœื˜/ืคืœื˜ ืžืกื•ืฃ
  • ืงืœื˜/ืคืœื˜ ืจืฉืช
  • ื’ื™ืฉื” ืœืžืขืจื›ืช ืงื‘ืฆื™ื ื•-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, mpprotect, BRK ืœื“ื‘ืจื™ื ื›ืžื• ื–ื™ื”ื•ื™ ื–ื™ื›ืจื•ืŸ ื‘ืจืžื” ื ืžื•ื›ื” ื•ื”ืฆื’ืช ืกืคืจื™ื•ืช ื“ื™ื ืžื™ื•ืช.) ืœืžืขืฉื”, ื‘ืžื”ืœืš ืื™ืชื•ืจ ื‘ืื’ื™ื ื‘ืคืœื˜ ืฉื˜ืจืก ืขื“ื™ืฃ ืœืงืจื•ื ืžื”ืกื•ืฃ. ื™ื”ื™ื” ืืชื’ืจ ืœืžื˜ื” ืœื›ืชื•ื‘, ืฉืžืฆื™ื’ื” ื”ื•ื“ืขืช ืฉื’ื™ืื”. ืื ื• ืžืกืชื›ืœื™ื ืœืžืขืœื” ื•ืจื•ืื™ื ืืช ืงืจื™ืืช ื”ืžืขืจื›ืช ื”ืฉื’ื•ื™ื” ื”ืจืืฉื•ื ื” - ื”ืงืจื™ืื” openat, ืžื” ืฉื–ื•ืจืง ืฉื’ื™ืื” ENOENT ("ืงื•ื‘ืฅ ืื• ืกืคืจื™ื™ื” ืœื ื ืžืฆืื•") ืžื ืกื” ืœื”ื™ืคืชื— /etc/foo/config.json. ื›ืืŸ ืฆืจื™ืš ืœื”ื™ื•ืช ืงื•ื‘ืฅ ื”ืชืฆื•ืจื”.

ื–ื• ื”ื™ื™ืชื” ืจืง ื“ื•ื’ืžื”, ืื‘ืœ ื”ื™ื™ืชื™ ืื•ืžืจ 90% ืžื”ื–ืžืŸ ืฉืื ื™ ืžืฉืชืžืฉ ื‘ื• ืฉื˜ืจืก, ืื™ืŸ ื“ื‘ืจ ื”ืจื‘ื” ื™ื•ืชืจ ืงืฉื” ืœืขืฉื•ืช ืžื–ื”. ืœื”ืœืŸ ืžื“ืจื™ืš ืžืœื ืฉืœื‘ ืื—ืจ ืฉืœื‘ ืœื ื™ืคื•ื™ ื‘ืื’ื™ื:

  • ืชืชืขืฆื‘ืŸ ื‘ื’ืœืœ ื”ื•ื“ืขื” ืžืขื•ืจืคืœืช ืขืœ ืฉื’ื™ืืช system-y ืžืชื•ื›ื ื™ืช
  • ื”ืคืขืœ ืžื—ื“ืฉ ืืช ื”ืชื•ื›ื ื™ืช ืขื ืฉื˜ืจืก
  • ืžืฆื ืืช ื”ื•ื“ืขืช ื”ืฉื’ื™ืื” ื‘ืชื•ืฆืื•ืช ื”ืžืขืงื‘
  • ืขืœื” ื’ื‘ื•ื” ื™ื•ืชืจ ืขื“ ืฉืชืคื’ืข ื‘ืฉื™ื—ืช ื”ืžืขืจื›ืช ืฉื ื›ืฉืœื” ื”ืจืืฉื•ื ื”

ืกื‘ื™ืจ ืžืื•ื“ ืฉื”ืงืจื™ืื” ืœืžืขืจื›ืช ื‘ืฉืœื‘ 4 ืชื’ืœื” ืžื” ื”ืฉืชื‘ืฉ.

ื˜ื™ืคื™ื

ืœืคื ื™ ืฉืืจืื” ืœืš ื“ื•ื’ืžื” ืœื ื™ืคื•ื™ ื‘ืื’ื™ื ืžื•ืจื›ื‘ ื™ื•ืชืจ, ืืจืื” ืœืš ื›ืžื” ื˜ืจื™ืงื™ื ืœืฉื™ืžื•ืฉ ื™ืขื™ืœ ืฉื˜ืจืก:

ื’ื‘ืจ ื”ื•ื ื—ื‘ืจ ืฉืœืš

ื‘ืžืขืจื›ื•ืช *nix ืจื‘ื•ืช, ื ื™ืชืŸ ืœืงื‘ืœ ืจืฉื™ืžื” ืžืœืื” ืฉืœ ืงืจื™ืื•ืช ืžืขืจื›ืช ืœืงืจื ืœ ืขืœ ื™ื“ื™ ื”ืคืขืœื” ื’ื‘ืจ ืžืชืงืฉืจ. ืืชื” ืชืจืื” ื“ื‘ืจื™ื ื›ืžื• brk(2), ื›ืœื•ืžืจ ื ื™ืชืŸ ืœืงื‘ืœ ืžื™ื“ืข ื ื•ืกืฃ ืขืœ ื™ื“ื™ ื”ืคืขืœื” ื’ื‘ืจ 2 ื‘ืจืง.

ืžื’ืจืคื” ืงื˜ื ื”: ืžื–ืœื’ ื’ื‘ืจ 2 ืžืจืื” ืœื™ ืืช ื”ื“ืฃ ืฉืœ ื”ืงืœื™ืคื” ืžื–ืœื’() ะฒ GNU libc, ืืฉืจ, ืžืกืชื‘ืจ, ืžื™ื•ืฉื ืขืœ ื™ื“ื™ ืงืจื™ืื” ืฉื™ื‘ื•ื˜ (). ื”ืชืงืฉืจ ืœืกืžื ื˜ื™ืงื” ืžื–ืœื’ ื ืฉืืจ ื–ื”ื” ืื ืืชื” ื›ื•ืชื‘ ืชื•ื›ื ื™ืช ื‘ืืžืฆืขื•ืช ืžื–ืœื’(), ื•ื”ืคืขืœ ืžืขืงื‘ - ืœื ืืžืฆื ืฉื™ื—ื•ืช ืžื–ืœื’, ื‘ืžืงื•ืžื ื™ื”ื™ื• ืฉื™ื‘ื•ื˜ (). ืžื’ืจืคื•ืช ื›ืืœื” ืจืง ืžื‘ืœื‘ืœื•ืช ืื•ืชืš ืื ืืชื” ืžืชื—ื™ืœ ืœื”ืฉื•ื•ืช ืืช ื”ืžืงื•ืจ ืขื ื”ืคืœื˜ ืฉื˜ืจืก.

ื”ืฉืชืžืฉ ื‘-o ื›ื“ื™ ืœืฉืžื•ืจ ืืช ื”ืคืœื˜ ืœืงื•ื‘ืฅ

ืฉื˜ืจืก ื™ื›ื•ืœ ืœื™ืฆื•ืจ ืคืœื˜ ื ืจื—ื‘, ื•ืœื›ืŸ ืœืจื•ื‘ ืฉื™ืžื•ืฉื™ ืœืื—ืกืŸ ืชื•ืฆืื•ืช ืžืขืงื‘ ื‘ืงื‘ืฆื™ื ื ืคืจื“ื™ื (ื›ืžื• ื‘ื“ื•ื’ืžื” ืœืžืขืœื”). ื–ื” ื’ื ืขื•ื–ืจ ืœืžื ื•ืข ื‘ืœื‘ื•ืœ ื‘ื™ืŸ ืคืœื˜ ืชื•ื›ื ื™ืช ืœืคืœื˜ ืฉื˜ืจืก ื‘ืงื•ื ืกื•ืœื”.

ื”ืฉืชืžืฉ ื‘-s ื›ื“ื™ ืœื”ืฆื™ื’ ื™ื•ืชืจ ื ืชื•ื ื™ ืืจื’ื•ืžื ื˜ื™ื

ืื•ืœื™ ืฉืžืชื ืœื‘ ืฉื”ื—ืฆื™ ื”ืฉื ื™ ืฉืœ ื”ื•ื“ืขืช ื”ืฉื’ื™ืื” ืื™ื ื• ืžื•ืฆื’ ื‘ืžืขืงื‘ ืœื“ื•ื’ืžื” ืฉืœืžืขืœื”. ื–ื” ื‘ื’ืœืœ ืฉื˜ืจืก ื‘ืจื™ืจืช ื”ืžื—ื“ืœ ืžืฆื™ื’ื” ืจืง ืืช 32 ื”ื‘ืชื™ื ื”ืจืืฉื•ื ื™ื ืฉืœ ืืจื’ื•ืžื ื˜ ื”ืžื—ืจื•ื–ืช. ืื ืืชื” ืจื•ืฆื” ืœืจืื•ืช ืขื•ื“, ื”ื•ืกืฃ ืžืฉื”ื• ื›ืžื• -ืฉ 128 ืœืฉื™ื—ื” ืฉื˜ืจืก.

-y ืžืงืœ ืขืœ ืžืขืงื‘ ืื—ืจ ืงื‘ืฆื™ื, ืฉืงืขื™ื ื•ื›ื•'.

"ื”ื›ืœ ื”ื•ื ืงื•ื‘ืฅ" ืคื™ืจื•ืฉื• ืฉืžืขืจื›ื•ืช *nix ืขื•ืฉื•ืช ืืช ื›ืœ ื”-I/O ื‘ืืžืฆืขื•ืช ืžืชืืจื™ ืงื‘ืฆื™ื, ื‘ื™ืŸ ืื ื–ื” ื—ืœ ืขืœ ืงื•ื‘ืฅ ืื• ืจืฉืช ืื• ืฆื™ื ื•ืจื•ืช ื‘ื™ืŸ-ืชื”ืœื™ื›ื™ื. ื–ื” ื ื•ื— ืœืชื›ื ื•ืช, ืื‘ืœ ืžืงืฉื” ืœืขืงื•ื‘ ืื—ืจ ืžื” ื‘ืืžืช ืงื•ืจื” ื›ืฉืืชื” ืจื•ืื” ืžืฉื•ืชืฃ ืœืงืจื•ื ะธ ืœื›ืชื•ื‘ ื‘ืชื•ืฆืื•ืช ืžืขืงื‘ ืฉื™ื—ื•ืช ื”ืžืขืจื›ืช.

ืขืœ ื™ื“ื™ ื”ื•ืกืคืช ืื•ืคืจื˜ื•ืจ ื›ืŸ, ืืชื” ืชื›ืจื™ื— ืฉื˜ืจืก ืกืžืŸ ื›ืœ ืžืชืืจ ืงื•ื‘ืฅ ื‘ืคืœื˜ ืขื ื”ืขืจื” ืฉืœ ืžื” ื”ื•ื ืžืฆื‘ื™ืข.

ืฆืจืฃ ืœืชื”ืœื™ืš ืฉื›ื‘ืจ ืคื•ืขืœ ื‘ืืžืฆืขื•ืช -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 ืœืชื›ื ื•ืช ืจืฉืช.

ื“ื•ื’ืžื” ื™ื•ืชืจ ืžื•ืจื›ื‘ืช ืœื ื™ืคื•ื™ ื‘ืื’ื™ื

ื›ื‘ืจ ืืžืจืชื™ ืฉื”ื“ื•ื’ืžื” ืฉืœ ืื™ืชื•ืจ ื‘ืื’ื™ื ืคืฉื•ื˜ ื”ื™ื ื“ื•ื’ืžื” ืœืžื” ืฉืื ื™ ืฆืจื™ืš ืœื”ืชืžื•ื“ื“ ืื™ืชื• ื‘ืขื™ืงืจ ื›ืฉืขื•ื‘ื“ื™ื ืขื ืฉื˜ืจืก. ืขื ื–ืืช, ืœืคืขืžื™ื ื ื“ืจืฉืช ื—ืงื™ืจื” ืืžื™ืชื™ืช, ืื– ื”ื ื” ื“ื•ื’ืžื” ืืžื™ืชื™ืช ืฉืœ ื ื™ืคื•ื™ ื‘ืื’ื™ื ืžืชืงื“ื ื™ื•ืชืจ.

bcron - ืžืชื–ืžืŸ ืขื™ื‘ื•ื“ ืžืฉื™ืžื•ืช, ื™ื™ืฉื•ื ื ื•ืกืฃ ืฉืœ ื“ืžื•ืŸ *nix cron. ื–ื” ืžื•ืชืงืŸ ื‘ืฉืจืช, ืื‘ืœ ื›ืฉืžื™ืฉื”ื• ืžื ืกื” ืœืขืจื•ืš ืืช ืœื•ื— ื”ื–ืžื ื™ื, ื–ื” ืžื” ืฉืงื•ืจื”:

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

ื‘ืกื“ืจ, ื–ื” ืื•ืžืจ bcron ื ื™ืกื” ืœื›ืชื•ื‘ ืงื•ื‘ืฅ ืžืกื•ื™ื, ืื‘ืœ ื–ื” ืœื ื”ืœืš, ื•ื”ื•ื ืœื ื™ื•ื“ื” ืœืžื”. ื—ึฒืฉื‚ึดื™ืคึธื” ืฉื˜ืจืก:

# 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 +++

ื™ืฉ ื”ื•ื“ืขืช ืฉื’ื™ืื” ืžืžืฉ ืœืงืจืืช ื”ืกื•ืฃ ืœื›ืชื•ื‘, ืื‘ืœ ื”ืคืขื ืžืฉื”ื• ืฉื•ื ื”. ืจืืฉื™ืช, ืื™ืŸ ืฉื’ื™ืืช ืงืจื™ืืช ืžืขืจื›ืช ืจืœื•ื•ื ื˜ื™ืช, ืฉื‘ื“ืจืš ื›ืœืœ ืžืชืจื—ืฉืช ืœืคื ื™ ื–ื”. ืฉื ื™ืช, ื‘ืจื•ืจ ืฉืื™ืคืฉื”ื• ืžื™ืฉื”ื• ื›ื‘ืจ ืงืจื ืืช ื”ื•ื“ืขืช ื”ืฉื’ื™ืื”. ื ืจืื” ืฉื”ื‘ืขื™ื” ื”ืืžื™ืชื™ืช ื”ื™ื ื‘ืžืงื•ื ืื—ืจ, ื• bcrontab ืคืฉื•ื˜ ืžืฉืžื™ืข ืืช ื”ื”ื•ื“ืขื”.

ืื ืืชื” ืžืกืชื›ืœ ืขืœ ื’ื‘ืจ 2 ืงืจื, ืืชื” ื™ื›ื•ืœ ืœืจืื•ืช ืฉื”ืืจื’ื•ืžื ื˜ ื”ืจืืฉื•ืŸ (3) ื”ื•ื ืžืชืืจ ืงื•ื‘ืฅ, ืฉ-*nix ืžืฉืชืžืฉ ื‘ื• ืขื‘ื•ืจ ื›ืœ ืขื™ื‘ื•ื“ื™ I/O. ื›ื™ืฆื“ ืื•ื›ืœ ืœื’ืœื•ืช ืžื” ืžื™ื™ืฆื’ ืžืชืืจ ืงื•ื‘ืฅ 3? ื‘ืžืงืจื” ื”ืกืคืฆื™ืคื™ ื”ื–ื”, ืืชื” ื™ื›ื•ืœ ืœืจื•ืฅ ืฉื˜ืจืก ืขื ืžืคืขื™ืœ ื›ืŸ (ืจืื” ืœืžืขืœื”) ื•ื–ื” ื™ืกืคืจ ืœืš ื‘ืื•ืคืŸ ืื•ื˜ื•ืžื˜ื™, ืื‘ืœ ื›ื“ื™ ืœื”ื‘ื™ืŸ ื“ื‘ืจื™ื ื›ืืœื”, ื›ื“ืื™ ืœื“ืขืช ืื™ืš ืœืงืจื•ื ื•ืœื ืชื— ืชื•ืฆืื•ืช ืžืขืงื‘.

ื”ืžืงื•ืจ ืฉืœ ืžืชืืจ ืงื•ื‘ืฅ ื™ื›ื•ืœ ืœื”ื™ื•ืช ืงืจื™ืื•ืช ืžืขืจื›ืช ืื—ืช ืžื™ื ื™ ืจื‘ื•ืช (ื”ื›ืœ ืชืœื•ื™ ืœืžื” ืžื™ื•ืขื“ ื”ืžืชืืจ - ืงื•ื ืกื•ืœื”, ืฉืงืข ืจืฉืช, ื”ืงื•ื‘ืฅ ืขืฆืžื• ืื• ืžืฉื”ื• ืื—ืจ), ืื‘ืœ ื‘ื™ืŸ ืื ื–ื” ื™ื”ื™ื”, ืื ื—ื ื• ืžื—ืคืฉื™ื ืฉื™ื—ื•ืช ืขืœ ื™ื“ื™ ื”ื—ื–ืจืช 3 (ื›ืœื•ืžืจ, ืื ื• ืžื—ืคืฉื™ื "= 3" ื‘ืชื•ืฆืื•ืช ื”ืžืขืงื‘). ื‘ืชื•ืฆืื” ื–ื• ื™ืฉ 2 ืžื”ื: openat ื‘ื—ืœืง ื”ืขืœื™ื•ืŸ ื• ืฉืงืข ื‘ืืžืฆืข. openat ืคื•ืชื— ืืช ื”ืงื•ื‘ืฅ ืื‘ืœ close(3) ืื– ื™ืจืื” ืฉื”ื•ื ื ืกื’ืจ ืฉื•ื‘. (ื’ืจืคื”: ื ื™ืชืŸ ืœืขืฉื•ืช ืฉื™ืžื•ืฉ ื—ื•ื–ืจ ื‘ืชื™ืื•ืจื™ ืงื‘ืฆื™ื ื›ืืฉืจ ื”ื ื ืคืชื—ื™ื ื•ืกื’ื•ืจื™ื). ืฉื‚ึดื™ื—ึธื” ืฉืงืข () ืžืชืื™ื ื›ื™ ื–ื” ื”ืื—ืจื•ืŸ ืœืคื ื™ ืœืงืจื•ื(), ื•ืžืกืชื‘ืจ ืฉ-bcrontab ืขื•ื‘ื“ ืขื ืžืฉื”ื• ื“ืจืš ืฉืงืข. ื”ืฉื•ืจื” ื”ื‘ืื” ืžืจืื” ืฉืžืชืืจ ื”ืงื•ื‘ืฅ ืžืฉื•ื™ืš ืืœื™ื• ืฉืงืข ื“ื•ืžื™ื™ืŸ ืฉืœ ื™ื•ื ื™ืงืก ื‘ื“ืจืš /var/run/bcron-spool.

ืื–, ืื ื—ื ื• ืฆืจื™ื›ื™ื ืœืžืฆื•ื ืืช ื”ืชื”ืœื™ืš ื”ืงืฉื•ืจ ืืœื™ื• ืฉืงืข ื™ื•ื ื™ืงืก ื‘ืฆื“ ื”ืฉื ื™. ื™ืฉ ื›ืžื” ื˜ืจื™ืงื™ื ืžืกื•ื“ืจื™ื ืœืžื˜ืจื” ื–ื•, ืฉื ื™ื”ื ืฉื™ืžื•ืฉื™ื™ื ืœืื™ืชื•ืจ ื‘ืื’ื™ื ื‘ืคืจื™ืกื•ืช ืฉืจืชื™ื. ื”ืจืืฉื•ืŸ ื”ื•ื ืœื”ืฉืชืžืฉ 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))

ื–ื” ืžืจืžื– ืฉื”ืžืื–ื™ืŸ ื”ื•ื ื”ืคืงื•ื“ื” inixserver, ืคื•ืขืœ ืขื ืžื–ื”ื” ืชื”ืœื™ืš 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/trace -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 ื•ื›ื•') ืชื”ืœื™ืš ื–ื” ืžื•ืœื™ื“ ืชื”ืœื™ืš ื™ืœื“, ืฉื›ืคื™ ืฉื ื™ืชืŸ ืœื ื—ืฉ, ืขื•ืฉื” ืืช ื”ืขื‘ื•ื“ื” ื”ืืžื™ืชื™ืช. ื•ืื ืืชื” ืฆืจื™ืš ืœืชืคื•ืก ืืช ืขืงื‘ื•ืชื™ื”, ื”ื•ืกื™ืคื• ืœืฉื™ื—ื” strace -f. ื–ื” ืžื” ืฉื ื’ืœื” ื›ืฉื ื—ืคืฉ ืืช ื”ื•ื“ืขืช ื”ืฉื’ื™ืื” ื‘ืชื•ืฆืื” ื”ื—ื“ืฉื” ืขื strace -f -o /tmp/trace -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

ืฉื ืงื‘ื•ืจ ื”ื›ืœื‘! ื”ืฉืจืช ืคื•ืขืœ ื›ืงืจื•ืŸ ืžืฉืชืžืฉ, ืืš ืจืง ืœืฉื•ืจืฉ ื™ืฉ ื”ืจืฉืื” ืœื›ืชื•ื‘ ืœืกืคืจื™ื™ื” /var/spool/cron/tmp/. ืคืงื•ื“ื” ืคืฉื•ื˜ื” chown cron /var/spool/cron/tmp/ ื™ืืœืฅ bcron ืœืขื‘ื•ื“ ื ื›ื•ืŸ. (ืื ื–ื• ืœื ื”ื™ื™ืชื” ื”ื‘ืขื™ื”, ืื– ื”ื—ืฉื•ื“ ื”ื‘ื ื‘ืกื‘ื™ืจื•ืช ื’ื‘ื•ื”ื” ื”ื•ื ืžื•ื“ื•ืœ ืื‘ื˜ื—ืช ืœื™ื‘ื” ื›ืžื• SELinux ืื• AppArmor, ืื– ื”ื™ื™ืชื™ ื‘ื•ื“ืง ืืช ื™ื•ืžืŸ ื”ื•ื“ืขื•ืช ื”ืœื™ื‘ื” ืขื dmesg.)

ื‘ืกืš ื”ื›ืœ

ืžืขืงื‘ ืื—ืจ ืงืจื™ืื•ืช ืžืขืจื›ืช ื™ื›ื•ืœ ืœื”ื™ื•ืช ืžื›ืจื™ืข ืขื‘ื•ืจ ืžืชื—ื™ืœื™ื, ืื‘ืœ ืื ื™ ืžืงื•ื•ื” ืฉื”ืจืื™ืชื™ ืฉื”ื ื“ืจืš ืžื”ื™ืจื” ืœื ืคื•ืช ื‘ืื’ื™ื ืžื—ืœืงื” ืฉืœืžื” ืฉืœ ื‘ืขื™ื•ืช ืคืจื™ืกื” ื ืคื•ืฆื•ืช. ืชืืจื• ืœืขืฆืžื›ื ืฉืืชื ืžื ืกื™ื ืœืืชืจ ื‘ืื’ื™ื ื‘ืจื™ื‘ื•ื™ ืชื”ืœื™ื›ื™ื bcronื‘ืืžืฆืขื•ืช ืžืืชืจ ื‘ืื’ื™ื ืฉืœื‘ ืื—ืจ ืฉืœื‘.

ื ื™ืชื•ื— ืชื•ืฆืื•ืช ืขืงื‘ื•ืช ืœืื—ื•ืจ ืœืื•ืจืš ืฉืจืฉืจืช ืฉื™ื—ื•ืช ื”ืžืขืจื›ืช ื“ื•ืจืฉ ืžื™ื•ืžื ื•ืช, ืื‘ืœ ื›ืคื™ ืฉืืžืจืชื™, ื›ืžืขื˜ ืชืžื™ื“, ืฉื™ืžื•ืฉ ืฉื˜ืจืก, ืื ื™ ืคืฉื•ื˜ ืžืงื‘ืœ ืืช ืชื•ืฆืืช ื”ืžืขืงื‘ ื•ืžื—ืคืฉ ืฉื’ื™ืื•ืช ื”ื—ืœ ืžื”ืกื•ืฃ. ื‘ื›ืœ ืžืงืจื”, ืฉื˜ืจืก ืขื•ื–ืจ ืœื™ ืœื—ืกื•ืš ื”ืจื‘ื” ื–ืžืŸ ื‘ื ื™ืคื•ื™ ื‘ืื’ื™ื. ืื ื™ ืžืงื•ื•ื” ืฉื–ื” ื™ื”ื™ื” ืฉื™ืžื•ืฉื™ ื’ื ืœืš.

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”