Skip to content

Commit

Permalink
Add support for jmaps in containers
Browse files Browse the repository at this point in the history
  • Loading branch information
bobrik committed May 18, 2018
1 parent a8d807a commit b86a15a
Showing 1 changed file with 29 additions and 14 deletions.
43 changes: 29 additions & 14 deletions jmaps
Original file line number Diff line number Diff line change
Expand Up @@ -72,25 +72,40 @@ for pid in $(pgrep -x java); do
mapfile=/tmp/perf-$pid.map
[[ -e $mapfile ]] && rm $mapfile

cmd="cd $AGENT_OUT; $JAVA_HOME/bin/java -Xms32m -Xmx128m -cp $AGENT_JAR:$JAVA_HOME/lib/tools.jar net.virtualvoid.perf.AttachOnce $pid $opts"
(( debug )) && echo $cmd

user=$(ps ho user -p $pid)
if [[ "$user" != root ]]; then
if [[ "$user" == [0-9]* ]]; then
# UID only, run sudo with #UID:
cmd="sudo -u '#'$user sh -c '$cmd'"

container=$(cat /proc/$pid/cgroup | grep :/docker/ | awk -F/ '{ print $NF }' | head -n1)
if [[ $container != "" ]]; then
container_pid=$(cat /proc/$pid/status | grep ^NSpid | awk '{ print $NF }')
echo "Prorcess $pid is in container $container"
docker cp $AGENT_JAR $container:/tmp
docker cp $AGENT_HOME/libperfmap.so $container:/tmp
docker exec -u $user $container sh -c "cd /tmp; java -Xms32m -Xmx128m -cp attach-main.jar:$(docker exec -u $user $container jrunscript -e 'java.lang.System.out.println(java.lang.System.getProperty("java.home"));')/../lib/tools.jar net.virtualvoid.perf.AttachOnce $container_pid $opts"
docker cp $container:/tmp/perf-$container_pid.map $mapfile
docker exec -u $user $container rm /tmp/perf-$container_pid.map
else
cmd="cd $AGENT_OUT; $JAVA_HOME/bin/java -Xms32m -Xmx128m -cp $AGENT_JAR:$JAVA_HOME/lib/tools.jar net.virtualvoid.perf.AttachOnce $pid $opts"
(( debug )) && echo $cmd

if [[ "$user" != root ]]; then
if [[ "$user" == [0-9]* ]]; then
# UID only, run sudo with #UID:
cmd="sudo -u '#'$user sh -c '$cmd'"
else
cmd="sudo -u $user sh -c '$cmd'"
fi
fi

echo $cmd

echo "Mapping PID $pid (user $user):"
if (( debug )); then
time eval $cmd
else
cmd="sudo -u $user sh -c '$cmd'"
eval $cmd
fi
fi

echo "Mapping PID $pid (user $user):"
if (( debug )); then
time eval $cmd
else
eval $cmd
fi
if [[ -e "$mapfile" ]]; then
chown root $mapfile
chmod 666 $mapfile
Expand Down

0 comments on commit b86a15a

Please sign in to comment.