xref: /freebsd/tools/test/stress2/tools/uleak.sh (revision 4d846d26)
1#!/bin/sh
2
3#
4# Copyright (c) 2015 EMC Corp.
5# All rights reserved.
6#
7# Redistribution and use in source and binary forms, with or without
8# modification, are permitted provided that the following conditions
9# are met:
10# 1. Redistributions of source code must retain the above copyright
11#    notice, this list of conditions and the following disclaimer.
12# 2. Redistributions in binary form must reproduce the above copyright
13#    notice, this list of conditions and the following disclaimer in the
14#    documentation and/or other materials provided with the distribution.
15#
16# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26# SUCH DAMAGE.
27#
28
29# Report user mode leaks.
30
31export COLUMNS=130
32i=0
33start=`date '+%s'`
34/bin/echo -n "           "
35ps -l | head -1
36trap break SIGINT
37
38while true; do
39	i=$((i + 1))
40	ps -axOvsz | sed 1d | awk -v loop=$i '$2 > 0 {print $1 "," $2 "," loop}'
41	sleep 10
42done | awk -F, '
43{
44	pid=$1
45	size=$2
46	loop=$3
47	if (size > s[pid]) {
48		n[pid]++
49		if (n[pid] > 6) {
50			print pid
51			fflush
52			n[pid] = 0
53		}
54		s[pid] = size
55	}
56	l[pid] = loop
57
58	# Reap dead processes
59	for (p in s) {
60		if (l[p] < loop - 1) {
61			delete s[p]
62			delete n[p]
63			delete l[p]
64		}
65	}
66}' | while read p; do
67	d=$(((`date '+%s'` - start) / 86400))
68	r=`ps -lp$p | sed 1d`
69	[ -n "$r" ] && echo "$d `date '+%T'` $r"
70done
71echo
72