diff --git a/bin/create-java-perf-map.sh b/bin/create-java-perf-map.sh index f5806b6..ea0fe38 100755 --- a/bin/create-java-perf-map.sh +++ b/bin/create-java-perf-map.sh @@ -2,6 +2,8 @@ set -e #set -x +source $(dirname $0)/sudo-wrap.sh + CUR_DIR=`pwd` PID=$1 OPTIONS=$2 @@ -37,9 +39,9 @@ fi if [[ "$LINUX" == "1" ]]; then - sudo rm $PERF_MAP_FILE -f - (cd $PERF_MAP_DIR/out && sudo -u \#$TARGET_UID -g \#$TARGET_GID $JAVA_HOME/bin/java -cp $ATTACH_JAR_PATH:$JAVA_HOME/lib/tools.jar net.virtualvoid.perf.AttachOnce $PID "$OPTIONS") - sudo chown root:root $PERF_MAP_FILE + runasroot rm $PERF_MAP_FILE -f + (cd $PERF_MAP_DIR/out && runasroot -u \#$TARGET_UID -g \#$TARGET_GID $JAVA_HOME/bin/java -cp $ATTACH_JAR_PATH:$JAVA_HOME/lib/tools.jar net.virtualvoid.perf.AttachOnce $PID "$OPTIONS") + runasroot chown root:root $PERF_MAP_FILE else rm -f $PERF_MAP_FILE (cd $PERF_MAP_DIR/out && $JAVA_HOME/bin/java -cp $ATTACH_JAR_PATH:$JAVA_HOME/lib/tools.jar net.virtualvoid.perf.AttachOnce $PID "$OPTIONS") diff --git a/bin/perf-java-flames b/bin/perf-java-flames index 874631b..432f191 100755 --- a/bin/perf-java-flames +++ b/bin/perf-java-flames @@ -1,6 +1,7 @@ #!/bin/sh set -e #set -x +source $(dirname $0)/sudo-wrap.sh PID=$1 @@ -30,6 +31,6 @@ if [ -z "$PERF_FLAME_OPTS" ]; then fi $PERF_MAP_DIR/bin/perf-java-record-stack $* -sudo perf script -i $PERF_DATA_FILE > $STACKS +runasroot perf script -i $PERF_DATA_FILE > $STACKS $FLAMEGRAPH_DIR/stackcollapse-perf.pl $PERF_COLLAPSE_OPTS $STACKS | tee $COLLAPSED | $FLAMEGRAPH_DIR/flamegraph.pl $PERF_FLAME_OPTS > $PERF_FLAME_OUTPUT echo "Flame graph SVG written to PERF_FLAME_OUTPUT='`readlink -f $PERF_FLAME_OUTPUT`'." diff --git a/bin/perf-java-record-stack b/bin/perf-java-record-stack index 1f2a4a4..e79b886 100755 --- a/bin/perf-java-record-stack +++ b/bin/perf-java-record-stack @@ -1,6 +1,7 @@ #!/bin/bash set -e #set -x +source $(dirname $0)/sudo-wrap.sh PERF_MAP_DIR=$(dirname $(readlink -f $0))/.. PID=$1 @@ -22,5 +23,5 @@ if [ -z "$PERF_DATA_FILE" ]; then fi echo "Recording events for $PERF_RECORD_SECONDS seconds (adapt by setting PERF_RECORD_SECONDS)" -sudo perf record -F $PERF_RECORD_FREQ -o $PERF_DATA_FILE -g -p $* -- sleep $PERF_RECORD_SECONDS +runasroot perf record -F $PERF_RECORD_FREQ -o $PERF_DATA_FILE -g -p $* -- sleep $PERF_RECORD_SECONDS $PERF_MAP_DIR/bin/create-java-perf-map.sh $PID "$PERF_MAP_OPTIONS" diff --git a/bin/perf-java-report-stack b/bin/perf-java-report-stack index 276b803..f4637ff 100755 --- a/bin/perf-java-report-stack +++ b/bin/perf-java-report-stack @@ -1,6 +1,7 @@ #!/bin/bash set -e #set -x +source $(dirname $0)/sudo-wrap.sh PID=$1 PERF_MAP_DIR=$(dirname $(readlink -f $0))/.. @@ -14,4 +15,4 @@ if [ -z "$PERF_DATA_FILE" ]; then fi $PERF_MAP_DIR/bin/perf-java-record-stack $* -sudo perf report -i $PERF_DATA_FILE +runasroot perf report -i $PERF_DATA_FILE diff --git a/bin/sudo-wrap.sh b/bin/sudo-wrap.sh new file mode 100755 index 0000000..5938f4f --- /dev/null +++ b/bin/sudo-wrap.sh @@ -0,0 +1,26 @@ +#!/bin/bash + +function runasroot() { + WANT_UID=0 + if [[ "$1" == "-u" ]]; then + WANT_UID=$2 + shift 2 + fi + + if [[ "$1" == "-g" ]]; then + WANT_GID=$2 + shift 2 + fi + + if [[ "\#$EUID" == "${WANT_UID}" || "\#$EGID" == "${WANT_GID}" ]]; then + command -v sudo + if [[ $? -eq 0 ]]; then + sudo -u ${WANT_UID} -g ${WANT_GID} $@ + else + echo "sudo is missing" + exit 1 + fi + else + $@ + fi +}