CLI

Collections

  • The Art of Command Line
  • ๐Ÿค– just is a handy way to save and run project-specific commands.
  • Structured text tools - The following is a list of text-based file formats and command line tools for manipulating each.
  • ls-lint - An extremely fast directory and filename linter - Bring some structure to your project filesystem
  • mise-en-place - dev tools, env vars, task runner
  • Flox is a virtual environment and package manager all in one.
  • Terminal Text Effects
  • chezmoi - Manage your dotfiles across multiple diverse machines, securely.
  • dotenvx - a better dotenvโ€“from the creator of dotenv.
    • run anywhere (cross-platform)
    • multi-environment
    • encrypted envs
  • Solarized - Precision colors for machines and people

Shell

  • try lets you run a command and inspect its effects before changing your live system. try uses Linux's namespaces (via unshare) and the overlayfs union filesystem.
  • atuin - โœจ Magical shell history
  • fish - the friendly interactive shell
    • pure.fish - Pretty, minimal, and fast prompt for Fish shell

Script

  • zx - A tool for writing better scripts using javascript

Features

  • Fig adds autocomplete to your terminal
  • Watchexec - Executes commands in response to file modifications

Reflex

Run a command when files change

I have been using reflex https://github.com/cespare/reflex for the same thing in some of our docker projects

+1 for reflex, love being able to have a config for development
Example .reflex.conf to run one command when an openapi spec changes and another when any go files change:

-g "spec.yaml" -- bash -c 'make'
-sr "\.go$" -- go run cmd/app/main.go

Then run it with:

reflex -d fancy -c .reflex.conf

Why you should use reflex instead

  • Reflex has no dependencies. No need to install Ruby or anything like that.
  • Reflex uses an appropriate file watching mechanism to watch for changes efficiently on your platform.
  • Reflex gives your command the name of the file that changed.
  • No DSL to learn -- just give it a shell command.
  • No plugins.
  • Not tied to any language, framework, workflow, or editor.

Viewer

์ ˆ๋Œ€ Cron์—์„œ ํ‘œ์ค€ ์ถœ๋ ฅ์„ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์„ธ์š” - root ๋ณผ๋ฅจ ํฌํ™” ๊ดด๋‹ด

์•„์นจ์„ ๊นจ์šด root disk ์‚ฌ์šฉ๋Ÿ‰ ์•Œ๋ฆผ

์˜ค์ „ 6์‹œ 40๋ถ„, ์šด์˜ ์„œ๋ฒ„ ์ค‘ ํ•˜๋‚˜์˜ ๋ฃจํŠธ ๋””์Šคํฌ ์‚ฌ์šฉ๋ฅ ์ด 90%๊ฐ€ ๋„˜๋Š”๋‹ค๋Š” ์•Œ๋ฆผ์ด ๋ฐœ์ƒํ–ˆ๋‹ค. Critical ๋ ˆ๋ฒจ ์•Œ๋ฆผ์ด์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ํŒ€์›์—๊ฒŒ ์ „ํ™”๊ฐ€ ๋ฐœ์‹ ๋๋‹ค.

์ด ์„œ๋ฒ„๋Š” ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ์šฉ๋„๋กœ ์‚ฌ์šฉํ•œ๋‹ค. ๋‹น์—ฐํžˆ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋Š” ๋ณ„๋„๋กœ ๋งˆ์šดํŠธํ•œ ๋ฐ์ดํ„ฐ ๋ณผ๋ฅจ์— ์ €์žฅ๋œ๋‹ค. ๋ฃจํŠธ ๋ณผ๋ฅจ์ด ์ด ์ •๋„๋กœ ๊ฐ€๋“์ฐจ๋Š” ๊ฒƒ์€ ์ž˜ ์ผ์–ด๋‚˜์ง€ ์•Š๋Š” ์ด์ƒํ•œ ์ผ์ด๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ์ดํ„ฐ๋ฅผ ํ™•์ธํ•ด๋ณด๋‹ˆ ํ•˜๋ฃจ๋งŒ์— ๋””์Šคํฌ ์šฉ๋Ÿ‰์ด 5GiB ๊ฐ€๋Ÿ‰ ์ฆ๊ฐ€ํ–ˆ๊ณ  ์ง€๊ธˆ๋„ ๋น ๋ฅธ ์†๋„๋กœ ์ฆ๊ฐ€ํ•˜๊ณ  ์žˆ์—ˆ๋‹ค.

๋””์Šคํฌ ์‚ฌ์šฉ๋Ÿ‰์ด ๋น ๋ฅด๊ฒŒ ์ฆ๊ฐ€ํ•˜๊ณ  ์žˆ์—ˆ์œผ๋ฏ€๋กœ ์šฐ์„  ๋ฃจํŠธ ๋ณผ๋ฅจ์„ ํ™•์žฅํ•ด ์žฅ์•  ๋ฐœ์ƒ์„ ๋ง‰์•˜๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์›์ธ์„ ๋ฐํžˆ์ง€๋Š” ๋ชปํ–ˆ๋‹ค.

์œ ๋ น ํŒŒ์ผ ์‚ฌ๊ฑด

/var/log ๋“ฑ ๋ฐ์ดํ„ฐ๋ฅผ ๋งŽ์ด ์ฐจ์ง€ํ• ๋งŒํ•œ ๊ณต๊ฐ„์„ ํ™•์ธํ•ด๋ณด์•˜์œผ๋‚˜ ํ—ˆ์‚ฌ์˜€๋‹ค. ๊ฒฐ๊ตญ du ๋ช…๋ น์–ด๋กœ ๋ฃจํŠธ ๋ณผ๋ฅจ์˜ ๋ชจ๋“  ์„œ๋ธŒ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ „์ˆ˜์กฐ์‚ฌ ํ•˜์˜€์ง€๋งŒ ๋””์Šคํฌ ์‚ฌ์šฉ๋Ÿ‰์ด ์ฆ๊ฐ€ํ•œ ์›์ธ์„ ์ฐพ์„ ์ˆ˜ ์—†์—ˆ๋‹ค. du ๋กœ ํ™•์ธํ•œ ๋ฃจํŠธ ๋ณผ๋ฅจ์˜ ์‚ฌ์šฉ๋Ÿ‰์€ 10GB ์ •๋„์˜€๋Š”๋ฐ ์•Œ ์ˆ˜ ์—†๋Š” 5GB๊ฐ€ ๋” ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์—ˆ๋‹ค.

(์ฐธ๊ณ : du ๋ช…๋ น์–ด๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฑด I/O ๋ถ€ํ•˜๊ฐ€ ์ƒ๋‹นํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์šด์˜ ์„œ๋ฒ„์—์„œ ์ˆ˜ํ–‰ํ•˜๊ธฐ๋Š” ๋ถ€๋‹ด์Šค๋Ÿฌ์šด ์ž‘์—…์ด๋‹ค. nice์™€ ionice๋ฅผ ์ด์šฉํ•ด ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ตœํ•˜๋กœ ์„ค์ •ํ•œ ๋’ค ์„œ๋ธŒ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ํ•˜๋‚˜์”ฉ ๊ฒ€์ฆํ•˜๋Š” ๋“ฑ์˜ ๋ฐฉ์‹์œผ๋กœ ๋ถ€ํ•˜๋ฅผ ๋ถ„์‚ฐํ•˜์˜€๋‹ค.)

์ฒ˜์Œ ๊ฒ€์ฆํ•œ ๊ฐ€์„ค์€ ext4์˜ ์˜ˆ์•ฝ ๊ณต๊ฐ„(Reserved space)๊ฐ€ 5GiB๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์ด์—ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์˜ˆ์•ฝ ๊ณต๊ฐ„์˜ ์ ์œ ์œจ์ด ์ „์ฒด ๋””์Šคํฌ ๊ณต๊ฐ„์˜ 5% ๊ฐ€๋Ÿ‰์ด๊ณ  ๋ฃจํŠธ ๋ณผ๋ฅจ์˜ ํฌ๊ธฐ๊ฐ€ 20GB์— ๋ถˆ๊ณผํ•˜๋‹ค๋Š” ์ ์„ ๊ฐ์•ˆํ•˜๋ฉด ๊ฐ€๋Šฅ์„ฑ์ด ๊ฑฐ์˜ ์—†์—ˆ๋‹ค.

๋‹ค์Œ ๊ฐ€์„ค์€ ๋งˆ์šดํŠธ๋กœ ์ธํ•œ ๋ฃจํŠธ ๋ณผ๋ฅจ ํŒŒ์ผ ๋ˆ„๋ฝ์ด์—ˆ๋‹ค. ๋ฃจํŠธ ๋ณผ๋ฅจ์—์„œ ์ด๋ฏธ ์‚ฌ์šฉํ•˜๋˜ ๋””๋ ‰ํ† ๋ฆฌ์— ๋‹ค๋ฅธ ๋””์Šคํฌ๋ฅผ ๋งˆ์šดํŠธ ํ–ˆ์„ ๋•Œ, ๊ธฐ์กด์— ๋””๋ ‰ํ† ๋ฆฌ์— ์žˆ๋˜ ํŒŒ์ผ๋“ค์€ ์—ฌ์ „ํžˆ ๋””์Šคํฌ๋ฅผ ์ ์œ ํ•˜์ง€๋งŒ du ๊ฒฐ๊ณผ์—์„œ๋Š” ๋‚˜ํƒ€๋‚˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ธฐ์กด์— ์‚ฌ์šฉํ•˜๋˜ ๋ฐ์ดํ„ฐ ๋ณผ๋ฅจ ์™ธ์— ๋‹ค๋ฅธ ๋””์Šคํฌ๋ฅผ ๋งˆ์šดํŠธํ•œ ์ ์€ ์—†์—ˆ๋‹ค.

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

๊ทธ๋Ÿผ ํ˜„์žฌ ์‹คํ–‰๋˜๋Š” ํ”„๋กœ์„ธ์Šค ์ค‘ ์‚ญ์ œ๋œ ํŒŒ์ผ์„ ์—ด๊ณ  ์žˆ๋Š” ๊ฒƒ์ด ์žˆ๋Š”์ง€๋ฅผ ๊ฒ€์ฆํ•˜๋ฉด ๋œ๋‹ค. ์‚ฌ์šฉํ•œ ๋ช…๋ น์–ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

# nice: CPU ์šฐ์„ ์ˆœ์œ„ ์ตœํ•˜๋กœ ์„ค์ •
# ionice: I/O ์šฐ์„ ์ˆœ์œ„ ์ตœํ•˜๋กœ ์„ค์ •
# +L1: ๋งํฌ ์ˆ˜๊ฐ€ 1๋ณด๋‹ค ์ž‘์€ ํŒŒ์ผ
nice -n19 ionice -c3 sudo lsof +L1

๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•ด๋ณด๋‹ˆ rsync๋ฅผ ์ด์šฉํ•ด ํ•ซ ์Šคํ† ๋ฆฌ์ง€์—์„œ ์›œ ์Šคํ† ๋ฆฌ์ง€๋กœ ํŒŒ์ผ์„ ์˜ฎ๊ธฐ๋Š” cron ํ”„๋กœ์„ธ์Šค(์ดํ•˜ warmer๋กœ ํ‘œ๊ธฐ)๊ฐ€ /tmp ๋””๋ ‰ํ† ๋ฆฌ์˜ ์‚ญ์ œ๋œ ํŒŒ์ผ์„ ์—ด์–ด๋‘๊ณ  ์žˆ์—ˆ๋‹ค. ํฌ๊ธฐ๋„ ์‚ฌ๋ผ์ง„ 5GB์™€ ์—‡๋น„์Šทํ–ˆ๋‹ค. ๋””์Šคํฌ ์‚ฌ์šฉ๋Ÿ‰์ด ๊ณ„์† ์ฆ๊ฐ€ํ•˜๊ณ  ์žˆ์—ˆ์œผ๋ฏ€๋กœ ํŒŒ์ผ์˜ ํฌ๊ธฐ์™€ ๋””์Šคํฌ ์ฆ๊ฐ€๋Ÿ‰์„ ๋ฉด๋ฐ€ํžˆ ๋Œ€์กฐํ•ด ๋ณผ ์—ฌ์œ ๋Š” ์—†์—ˆ๋‹ค. ์ง๊ฐ์ด ๋งํ•˜๋Š”๋Œ€๋กœ ์ด ํ”„๋กœ์„ธ์Šค๋ฅผ kill ํ•˜์ž ์ฆ‰์‹œ ๋””์Šคํฌ ์‚ฌ์šฉ๋Ÿ‰์ด ๊ฐ์†Œํ–ˆ๋‹ค.

(์ฐธ๊ณ : ํ•ซ ์Šคํ† ๋ฆฌ์ง€๋Š” ์กฐํšŒ์™€ ์“ฐ๊ธฐ ๋ถ€ํ•˜๊ฐ€ ์ƒ๋Œ€์ ์œผ๋กœ ๋†’์€, ์ฆ‰ '๋œจ๊ฑฐ์šด' ์ €์žฅ์†Œ์ด๋‹ค. ๋ฐ˜๋ฉด warm ์Šคํ† ๋ฆฌ์ง€๋Š” ๋ถ€ํ•˜๊ฐ€ ์ƒ๋Œ€์ ์œผ๋กœ ๋‚ฎ์€ '๋ฏธ์ง€๊ทผํ•œ' ์ €์žฅ์†Œ์ด๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์›œ ์Šคํ† ๋ฆฌ์ง€๋Š” ํ•ซ ์Šคํ† ๋ฆฌ์ง€๋ณด๋‹ค ์ €๋ ดํ•œ ํƒ€์ž…์„ ์‚ฌ์šฉํ•œ๋‹ค. ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ์ดํ„ฐ๋Š” ์ตœ๊ทผ ๋ฐ์ดํ„ฐ์˜ ์กฐํšŒ ๋นˆ๋„๊ฐ€ ํ›จ์”ฌ ๋†’๊ธฐ ๋•Œ๋ฌธ์— hot/warm ๊ตฌ๋ถ„์˜ ๊ทผ๊ฑฐ๊ฐ€ ๋ช…ํ™•ํ•˜๋‹ค.)

๋ฒ”์ธ ๊ฒ€๊ฑฐ

warmer๋ฅผ ๋‹ค์‹œ ์‹คํ–‰ํ•˜์ž ๋””์Šคํฌ ์‚ฌ์šฉ๋Ÿ‰์ด ๋‹ค์‹œ ์ฆ๊ฐ€ํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค. lsof ๊ฒฐ๊ณผ๋„ ์ „๊ณผ ์œ ์‚ฌํ–ˆ๋‹ค. /tmp ๋””๋ ‰ํ† ๋ฆฌ์— ์กด์žฌํ–ˆ์œผ๋‚˜ ์ง€๊ธˆ์€ ์‚ญ์ œ๋œ ํŒŒ์ผ์„ ์—ด์–ด๋‘๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๋ณด์•ˆ ๋กœ๊ทธ๋ฅผ ํ†ตํ•ด ๋ชจ๋“  ์‚ฌ์šฉ์ž์˜ ๋ช…๋ น์–ด๋ฅผ ๊ฒ€์ƒ‰ํ•ด๋ณด์•˜์œผ๋‚˜ ์‚ญ์ œ ๋ช…๋ น์–ด๋ฅผ ์ˆ˜ํ–‰ํ•œ ์‚ฌ๋žŒ์€ ์—†์—ˆ๋‹ค. ๊ฒฐ๊ตญ ์‚ฌ๋žŒ์ด ์•„๋‹Œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ง€์šด ๊ฒƒ์ด ๋ช…ํ™•ํ–ˆ๋‹ค.

ionotifywait ๋ช…๋ น์–ด๋ฅผ ์ด์šฉํ•ด /tmp ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋ง ํ•ด๋ณด๋‹ˆ ํ™•์‹คํžˆ ๋ณ€๊ฒฝ์ด ์ผ์–ด๋‚˜๊ณค ์žˆ์—ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด ๋ช…๋ น์–ด๋กœ๋Š” ์–ด๋–ค ํ”„๋กœ์„ธ์Šค๊ฐ€ ํŒŒ์ผ์„ ๋งŒ๋“ค๊ณ  ์‚ญ์ œํ•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์—†์—ˆ๋‹ค.

๋‚˜๋Š” ๋ฒ”์ธ์œผ๋กœ rsync๋ฅผ ์˜์‹ฌํ–ˆ๋‹ค. warmer์˜ ์ฃผ์š” ์—…๋ฌด๊ฐ€ rsync๋ฅผ ์‹คํ–‰์ด์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์กฐ์‚ฌ ๊ฒฐ๊ณผ rsync๋Š” ํŒŒ์ผ์„ ๋ณต์‚ฌํ•  ๋•Œ ์ž„์‹œ ํŒŒ์ผ์„ ์ƒ์„ฑํ•œ๋‹ค๊ณ  ํ–ˆ๋‹ค. ํ™•์‹ ์„ ์–ป์€ ๋‚˜๋Š” ์ƒํ™ฉ์„ ์žฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ ํ…Œ์ŠคํŠธ๋ฅผ ํ–ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์†Œ๋“์€ ๋‚ด๊ฐ€ ํ‹€๋ ธ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ์•˜๋‹ค๋Š” ๊ฒƒ ๋ฟ์ด์—ˆ๋‹ค. rsync๋Š” ์ž„์‹œ ํŒŒ์ผ์„ /tmp๊ฐ€ ์•„๋‹ˆ๋ผ ๋ชฉ์ ์ง€ ๋””๋ ‰ํ† ๋ฆฌ์— ์ƒ์„ฑํ–ˆ๋‹ค. ์ž„์‹œ ํŒŒ์ผ์„ ์ €์žฅํ•  ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ํ”Œ๋ž˜๊ทธ๋กœ ๋”ฐ๋กœ ์ง€์ •ํ•˜๋ฉด ๊ทธ๋ ‡์ง€ ์•Š์„์ˆ˜๋„ ์žˆ์ง€๋งŒ, ์šฐ๋ฆฌ๋Š” ๋””ํดํŠธ ๊ฐ’์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ๋‹ค.

๊ทธ๋ž˜๋„ warmer์— ๋Œ€ํ•œ ์˜์‹ฌ์„ ์ ธ๋ฒ„๋ฆด ์ˆ˜ ์—†์—ˆ๋˜ ๋‚˜๋Š” /proc ๋””๋ ‰ํ† ๋ฆฌ์— ์ ‘๊ทผํ•ด ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ์กฐํšŒํ–ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ warmer์˜ 1,2 ๋ฒˆ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๊ฐ€ /tmp ๋””๋ ‰ํ† ๋ฆฌ์˜ ์‚ญ์ œ๋œ ํŒŒ์ผ์„ ์ง€์‹œํ•˜๋Š” ์‹ฌ๋ณผ๋ฆญ ๋งํฌ์˜€๋‹ค.

์ฆ‰ stdout๊ณผ stderr๊ฐ€ /tmp ๋””๋ ‰ํ† ๋ฆฌ์— ์ถœ๋ ฅ๋˜๊ณ  ์žˆ์œผ๋‚˜, ํŒŒ์ผ์€ ๋‚จ์•„์žˆ์ง€ ์•Š๊ณ  ์‚ญ์ œ๋˜๊ณ  ์žˆ์—ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด์„œ๋„ warmer ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ๊ทธ ์‚ญ์ œ๋œ ํŒŒ์ผ์„ ๊ณ„์† ์—ด์–ด๋‘๊ณ  ์žˆ๋Š” ์ƒํ™ฉ์ด์—ˆ๋‹ค.

warmer๋Š” crontab์œผ๋กœ ์‹คํ–‰๋˜๊ณ  ์žˆ์—ˆ๊ณ  stdout๊ณผ stderr๋ฅผ ๋”ฐ๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธํ•˜์ง„ ์•Š์•˜๋‹ค. cron์€ ํ„ฐ๋ฏธ๋„์„ ํ†ตํ•ด ์ ‘์†ํ•œ ์‚ฌ์šฉ์ž๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ ๋กœ๊ทธ๋ฅผ ์ฐ์„ ๊ณณ์ด ์—†๊ธด ํ•˜๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋„ ๋””๋ฐ”์ด์Šค(/dev/null)๋กœ ์ถœ๋ ฅ์„ ๋ฒ„๋ฆฌ์ง€ ์•Š๊ณ , '์ถœ๋ ฅ์„ ์ž„์‹œ ํŒŒ์ผ์— ์ €์žฅํ•œ ๋’ค ์‚ญ์ œํ•˜๋˜ ๋‹ซ์ง€๋Š” ์•Š๋Š”๋‹ค.' ๋ผ๋Š” ์ด์ƒํ•œ ์„ ํƒ์„ ํ•œ ๊ฒƒ์ด์—ˆ๋‹ค.

์žฌํ˜„ ํ…Œ์ŠคํŠธ๋ฅผ ๊ฑฐ์นœ ๊ฒฐ๊ณผ cron์ด ๋‚ด๊ฐ€ ์ถ”์ธกํ•œ ๋ฐฉ์‹๋Œ€๋กœ ๋™์ž‘ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ํ™•์‹ ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ํ‘œ์ค€ ์ถœ๋ ฅ์— ๋ฌด์˜๋ฏธํ•œ ๋กœ๊ทธ๋ฅผ ๋‚จ๊ธฐ๋Š” shell script๋ฅผ cron์œผ๋กœ ์‹คํ–‰ํ•œ ๋’ค, ์•ž์„œ ์ด์•ผ๊ธฐ ํ•œ lsof ๋ช…๋ น์–ด ๊ฒฐ๊ณผ์™€ /proc ๋””๋ ‰ํ† ๋ฆฌ์˜ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ์กฐํšŒํ•ด๋ณด๋ฉด ๋™์ผํ•œ ํ˜„์ƒ์ด ์žฌํ˜„๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

#!/bin/bash

while true; do
  head -c $((50 * 1024 * 1024)) < /dev/zero | tr '\0' 'A'
  sleep 10
done

(์‹คํ—˜ ํ™˜๊ฒฝ: Ubuntu 24.04)

๋งˆ์น˜๋ฉฐ

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

  • ํŒŒ์ผ์— ๋กœ๊ทธ๋ฅผ ๋‚จ๊ธด๋‹ค.
  • ๋กœ๊ทธ ํŒŒ์ผ์€ ๋ฃจํŠธ ๋ณผ๋ฅจ์ด ์•„๋‹ˆ๋ผ ๋ฐ์ดํ„ฐ ๋ณผ๋ฅจ์— ์œ„์น˜์‹œ์ผœ์•ผ ํ•œ๋‹ค
  • logrotate ๋“ฑ์˜ ์ˆ˜๋‹จ์„ ์ด์šฉํ•ด ํฌ๊ธฐ๊ฐ€ ๋ฌดํ•œ์ • ์ปค์ง€์ง€ ์•Š๋„๋ก ์ œ์–ดํ•ด์•ผ ํ•œ๋‹ค.

Children
  1. 5 Modern Bash Scripting Techniques That Only A Few Programmers Know
  2. A list of new(ish) command line tools