実行中の複数のサービスとtopを使用して現在の状態を表示するbashスクリプトがあります。
top -b -n1 -p `pgrep -f "proc1|proc2|proc3|proc4|proc5" |
tr '\n' ',' | # replace the newlines in the pid list with commas
sed 's/,$//g'` | # remove the trailing comma and submit to top
grep -vx '.*sed' | # From the top output: remove the entry for sed
sed 1,6d | # and remove the first 6 lines of top
生産する
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
660 user1 20 0 5800588 658868 39384 S 0.0 4.3 0:47.72 proc1
718 user1 20 0 2089772 41068 25032 S 0.0 0.3 0:00.82 proc2
722 user1 20 0 1046316 34172 25000 S 0.0 0.2 0:02.85 proc3
725 user1 20 0 833716 23376 18404 S 0.0 0.2 0:00.21 proc4
729 user1 20 0 2369604 108084 34292 S 0.0 0.7 0:02.76 proc5
次に、各 pid を取得して 'ps -p <pid> -o start' に渡し、出力をその行に挿入して以下を生成しようとします。
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ STARTED COMMAND
660 user1 20 0 5800588 658868 39384 S 0.0 4.3 0:47.72 08:56:23 proc1
718 user1 20 0 2089772 41068 25032 S 0.0 0.3 0:00.82 08:56:24 proc2
722 user1 20 0 1046316 34172 25000 S 0.0 0.2 0:02.85 10:27:41 proc3
725 user1 20 0 833716 23376 18404 S 0.0 0.2 0:00.21 08:56:27 proc4
729 user1 20 0 2369604 108084 34292 S 0.0 0.7 0:02.76 08:56:29 proc5
awkを使用してpidを抽出できることを知っていますが、どのように出力をマージ/挿入しますか?
答え1
私はそれについて考えた。私はまた、pgrepの-dスイッチが改行をコンマに置き換えることを防ぐことを発見しました。
echo " PID USER VIRT RES SHR %CPU %MEM TIME+ START COMMAND"
top -b -n1 -p `pgrep -d , -f "proc1|proc2|proc3|proc4|proc5"` |
sed 1,7d | # and remove the first 6 lines of top
awk 'BEGIN { OFS="\t" } { command=sprintf("ps -o stime= %s", $1); command | getline time; close(command);
printf("%7s %-10s %8s %8s %8s %5s %5s %9s %6s %s\n", $1, $2, $5, $6, $7, $9, $10, $11 , time, $12) }'