pstrace
bash에서 인터페이스를 변경하는 래퍼 스크립트를 어떻게 구현합니까?
[sudo] strace -c -p [PID]
에게
[sudo] pstrace -c -p [PROCESS-NAME]
방법과 비슷하다
killall [PROCESS-NAME]
사용. 완성과 모든 것.
답변1
버전 5.15부터 strace는 명령/프로세스 이름을 인쇄할 수 있습니다.
- PID에 대한 명령 이름을 인쇄하기 위한
--decode-pids=comm
옵션(및 해당 별칭 )이 구현되었습니다 .-Y
답변2
당신은 이것을 :
ps auxw | grep [PROCESS-NAME] | awk '{print"-p " $2}' | xargs strace
답변3
믿을 수 없을 정도로 복잡한 요구 사항 :-)
두 부분으로, 먼저 pstrace
의 래퍼 스크립트 는 이름-PID 작업에 strace
사용됩니다 .pgrep
#!/bin/bash
IFS=$' \t\n'
# process the arguments to find "-p procname", only support one instance though
for ((nn=1; nn<=$#; nn++)); do
if [ "${!nn}" = "-p" ]; then
:
elif [ "$prev" = "-p" ]; then
pname="${!nn}"
else
args+=( "${!nn}" ) # just copy
fi
prev="${!nn}"
done
pids=()
if [ -n "$pname" ]; then
# skip this shell's PID, which pgrep -f will match
# note the use of exec to avoid picking up a matching subshell too
# uncomment && printf for pid/pname list
while read pp pname; do
[ "$pp" != "$$" ] && pids+=($pp) # && printf "%6i %s\n" "$pp" "$pname"
done < <(exec pgrep -l -f "${pname}")
fi
npids=${#pids[*]}
if [ $npids -eq 0 ]; then
echo "No PIDs to trace."; exit 2
elif [ $npids -eq 1 ]; then
args=( "${args[@]}" -p ${pids[0]} )
elif [ $npids -le 32 ]; then
read -p "$npids PIDS found, enter Y to proceed: " yy
[ "$yy" != "Y" ] && echo "Cancelled..." && exit 1
args=( "${args[@]}" ${pids[@]/#/-p } )
else
echo "Too many PIDs to trace: $npids (max 32)."; exit 2
fi
strace "${args[@]}"
두 번째 부분에서는 프로그래밍 가능한 완성을 사용하여 bash
이름별로 프로세스를 완료하고 이를 귀하 ~/.bash_profile
또는 유사한 항목에 입력합니다.
# process-name patterns to ignore
PROCIGNORE=( "^\[", "^-bash" )
_c8n_listprocs ()
{
local cur prv ignore IFS nn mm
prv=${COMP_WORDS[COMP_CWORD-1]}
cur=${COMP_WORDS[COMP_CWORD]}
case "$prv" in
'-p')
IFS=$'\n' COMPREPLY=( $(ps axwwo "args") ) IFS=$' \t\n'
COMPREPLY=(${COMPREPLY[*]// */}) # remove arguments
ignore="0" # ps header
for ((nn=1; nn<${#COMPREPLY[*]}; nn++)); do
# filter by (partially) typed name in cur
# use " =~ ^$cur " for prefix match, without ^ it's substr match
[[ -n "$cur" && ! "${COMPREPLY[$nn]}" =~ $cur ]] && {
ignore="$nn $ignore"
} || {
# skip names matching PROCIGNORE[]
for ((mm=0; mm<${#PROCIGNORE[*]}; mm++)); do
[[ "${COMPREPLY[$nn]}" =~ ${PROCIGNORE[$mm]} ]] &&
ignore="$nn $ignore"
done
}
done
# remove unwanted, in reverse index order
for nn in $ignore; do unset COMPREPLY[$nn]; done
;;
*) COMPREPLY=()
;;
esac
}
complete -F _c8n_listprocs pstrace
bash-3.x 및 bash-4.x를 사용하여 Linux에서 테스트 및 사용되었습니다. ps
Linux가 아닌 플랫폼에서는 옵션을 조정해야 할 수 있으며 truss
한 줄 변경도 지원해야 합니다.
제한 사항은 다음과 같습니다.
- process 와 같은 커널 스레드를 올바르게 이스케이프 처리하지 않으면 원하는 작업을 수행하지 못할 가능성이 높습니다
[names]
.pgrep
- 이름에 공백이 있는 프로세스가 일치하지 않습니다( 사용 가능한 경우 사용할 수 있도록 " "
args
대신 " "을 사용함 ).comm
/paths