docker exec や kubectl exec して入ったコンテナに ps コマンドがインストールされていない時に使う代替コマンド

## まえがき docker exec や kubectl exec して入ったコンテナに ps コマンドがインストールされていないことってありますよね。 ```console $ ps -ef bash: ps: command not found ``` 僕はよくあります。 (そして大抵なんらかのトラブルに追われています) おもむろに `apt-get update -qqy && apt-get install -qqy procps` しても、 ```console $ apt-get update -qqy && apt-get install -qqy procps E: List directory /var/lib/apt/lists/partial is missing. - Acquire (13: Permission denied) ``` 無慈悲の `Permission denied` を食らいます。 [Best practices for writing Dockerfiles#USER](https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#user) を実践していて大変偉いですね。 こまった。 そんな時に使う代替コマンド (ワンライナー) をご紹介します。 # ps コマンドの代替ワンライナー ```sh ps_sh() { _piddirs=$(find /proc -maxdepth 1 -type d -name "[0-9]*"); printf "UID\tPID\tPPID\tCMD\n"; echo "$_piddirs" | sed s@/proc/@@ | while read -r PID; do if [ -d "/proc/$PID" ]; then printf "%s\t%d\t%d\t%s\n" "$(stat -c "%U" "/proc/$PID")" "$PID" "$(cut -d" " -f4 "/proc/$PID/stat")" "$(cat -e "/proc/$PID/cmdline" | sed "s/\^@$//; s/\^@/ /g")"; fi; done; } && ps_sh ``` 関数を無理やりワンライナーにしているので非常に見づらい…。 フォーマットするとこんな感じです。 ```sh ps_sh() { _piddirs=$(find /proc -maxdepth 1 -type d -name "[0-9]*") printf "UID\tPID\tPPID\tCMD\n" echo "$_piddirs" | sed s@/proc/@@ | while read -r PID; do if [ -d "/proc/$PID" ]; then printf "%s\t%d\t%d\t%s\n" "$(stat -c "%U" "/proc/$PID")" "$PID" "$(cut -d" " -f4 "/proc/$PID/stat")" "$(cat -e "/proc/$PID/cmdline" | sed "s/\^@$//; s/\^@/ /g")"; fi; done } ``` `/proc` 配下を find して、頑張って ps っぽい出力を組み上げています。 実際に使ってみた様子はこんな感じです。 ```console $ ps_sh() { _piddirs=$(find /proc -maxdepth 1 -type d -name "[0-9]*"); printf "UID\tPID\tPPID\tCMD\n"; echo "$_piddirs" | sed s@/proc/@@ | while read -r PID; do if [ -d "/proc/$PID" ]; then printf "%s\t%d\t%d\t%s\n" "$(stat -c "%U" "/proc/$PID")" "$PID" "$(cut -d" " -f4 "/proc/$PID/stat")" "$(cat -e "/proc/$PID/cmdline" | sed "s/\^@$//; s/\^@/ /g")"; fi; done; } && ps_sh UID PID PPID CMD mysql 1 0 mysqld --general-log=true --slow-query-log=true mysql 111 0 sh ``` 多少物足りないですが、最低限見たいものは見えてそう。 ## あとがき 数年前に作ったワンライナーですが、ずっと現役で活躍してくれてます。 Shell Script One-liner is GOD.
このエントリーをはてなブックマークに追加

このブログの人気の投稿

OpenTelemetry 互換の Observability 基盤比較検討

AWS アカウントを作成したらまず実行するスクリプト

Hello, World!