Interfacing PID পরিবর্তে প্রসেস নাম দিয়ে স্ট্রেস


4

আমি কিভাবে একটি wrapper স্ক্রিপ্ট বাস্তবায়ন করবেন pstrace ইন্টারফেস পরিবর্তন যে bash মধ্যে

[sudo] strace -c -p [PID]

থেকে

[sudo] pstrace -c -p [PROCESS-NAME]

কিভাবে অনুরূপ

killall [PROCESS-NAME]

ব্যবহৃত হয়. সমাপ্তি এবং সবকিছু সঙ্গে।

উত্তর:


2

তোমার এই

ps auxw | grep [PROCESS-NAME] | awk '{print"-p " $2}' | xargs strace

1

বিভ্রান্তিকর জটিল প্রয়োজনীয়তা :-)

দুই ভাগে, প্রথমত pstrace জন্য মোড়ানো স্ক্রিপ্ট 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

পরীক্ষা করা & amp; bash-3.x এবং bash-4.x সঙ্গে linux ব্যবহার করা হয়। ps অপশনগুলিও অ-লিনাক্স প্ল্যাটফর্মগুলিতে tweaking প্রয়োজন হতে পারে, সমর্থন করা উচিত truss একটি লাইন পরিবর্তন সঙ্গে।

সীমাবদ্ধতা অন্তর্ভুক্ত:

  • কার্নেল-থ্রেড প্রক্রিয়া মত কোন সঠিক escaping [names], এই কারণ হবে pgrep (সম্ভবত) আপনি চান কি না
  • নামের মধ্যে স্থান সঙ্গে প্রসেস মিশ্রিত (" args "পরিবর্তে ব্যবহার করা হয়" comm "তাই যে /paths ব্যবহার করা যেতে পারে, যেখানে পাওয়া যায়)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.