কোনও প্রক্রিয়া কী সংকেত শুনছে তা আমি কীভাবে পরীক্ষা করতে পারি?


81

কোনও চলমান প্রক্রিয়া কোনও সিগন্যাল ধরে ফেলবে কি না তা আমি কীভাবে যাচাই করতে পারি, বা এড়িয়ে যাব বা এটি ব্লক করব? আদর্শভাবে আমি সিগন্যালের একটি তালিকা দেখতে চাই বা কমপক্ষে প্রকৃতপক্ষে চেক করার জন্য সংকেত পাঠাতে হবে না।

উত্তর:


109

লিনাক্সের অধীনে, আপনি আপনার প্রক্রিয়াটির পিআইডি খুঁজে পেতে পারেন, তারপরে দেখুন /proc/$PID/status। এটিতে এমন লাইন রয়েছে যা বর্ণনা করে যে কোন সিগন্যালগুলি অবরুদ্ধ রয়েছে (সিগব্লক), উপেক্ষা করা হবে (সিগআইগন), বা ধরা পড়েছে (সিগসিজিটি)।

# cat /proc/1/status
...
SigBlk: 0000000000000000
SigIgn: fffffffe57f0d8fc
SigCgt: 00000000280b2603
...

ডানদিকে সংখ্যাটি বিটমাস্ক। আপনি বাইনারিতে হেক্স থেকে এটা রূপান্তর করেন, তাহলে প্রতিটি 1-বিট, একটি ধরা সংকেত প্রতিনিধিত্ব করে তাই SigCgt লাইন ব্যাখ্যা দ্বারা অধিকার 1. দিয়ে শুরু বাম থেকে গণনা, আমরা দেখতে পারি যে আমার initপ্রক্রিয়া নিম্নলিখিত সংকেত সংক্রামক হয়:

00000000280b2603 ==> 101000000010110010011000000011
                     | |       | ||  |  ||       |`->  1 = SIGHUP
                     | |       | ||  |  ||       `-->  2 = SIGINT
                     | |       | ||  |  |`----------> 10 = SIGUSR1
                     | |       | ||  |  `-----------> 11 = SIGSEGV
                     | |       | ||  `--------------> 14 = SIGALRM
                     | |       | |`-----------------> 17 = SIGCHLD
                     | |       | `------------------> 18 = SIGCONT
                     | |       `--------------------> 20 = SIGTSTP
                     | `----------------------------> 28 = SIGWINCH
                     `------------------------------> 30 = SIGPWR

(আমি kill -lবাশ থেকে চালিয়ে নাম্বার-টু-নাম ম্যাপিং পেয়েছি))

সম্পাদনা : এবং পজিক্স শ মধ্যে জনপ্রিয় চাহিদা, একটি স্ক্রিপ্ট by

sigparse () {
    i=0
    # bits="$(printf "16i 2o %X p" "0x$1" | dc)" # variant for busybox
    bits="$(printf "ibase=16; obase=2; %X\n" "0x$1" | bc)"
    while [ -n "$bits" ] ; do
        i="$(expr "$i" + 1)"
        case "$bits" in
            *1) printf " %s(%s)" "$(kill -l "$i")" "$i" ;;
        esac
        bits="${bits%?}"
    done
}

grep "^Sig...:" "/proc/$1/status" | while read a b ; do
        printf "%s%s\n" "$a" "$(sigparse "$b")"
    done # | fmt -t  # uncomment for pretty-printing

2
যদি একটি সিগন্যাল নীচে তালিকাভুক্ত করা SigBlkহয় তবে এটিও উপস্থিত হবে SigCgt? কারণ এটিকে অবরুদ্ধ করে, এর অর্থ হ'ল সামান্য পরে সিগন্যালটি আবার প্রেরণ করা হবে এবং কী ধরা দরকার?
সিএমসিডিগ্রাগনকাই

না, আপনি এটি ধরতে প্রস্তুত না হয়ে কোনও সিগন্যাল আটকে দিতে পারেন। আপনি যদি কোনও সিগন্যাল ধরে না রাখেন তবে সিগন্যালের উপর নির্ভর করে একটি ডিফল্ট ক্রিয়া ঘটবে (সাধারণত সমাপ্তির প্রক্রিয়া)। আপনি যদি আরও বিশদ চান তবে আপনার উচিত একটি প্রশ্ন খোলার।
জান্ডার

স্ক্রিপ্ট পড়ার কোনও পসিক্স সংস্করণ ব্যবহার কী /proc? এটি কেবল লিনাক্সে কাজ করবে ... এবং localপসিক্স নয়। ঠিক আছে, এটি কিন্ডা তবে এর প্রভাবটি "অনির্ধারিত"।
কুসালানন্দ

2
@ কুসালানন্দ: লিনাক্স ব্যাশকে বোঝায় না - উদাহরণস্বরূপ, ছোট এমবেডেড প্ল্যাটফর্মগুলি প্রায়শই ব্যাসিবক্স ব্যবহার করে - তবে পসিক্স সম্মতি কোনও আধুনিকের কাছে কাছের গ্যারান্টি /bin/sh। আপনি ঠিক বলেছেন local; আমি এটি পরিষ্কার করব।
জান্ডার

@ জেন্ডার ফেয়ার পয়েন্ট আমি বাশ এবং লিনাক্স সম্পর্কে তাত্ক্ষণিক ধারণা গ্রহণ করার জন্য স্বীকার করি।
কুসালানন্দ

23

সোলারিসে, psigসংকেতগুলির তালিকা এবং সেগুলি কীভাবে পরিচালনা করা হবে তা পেতে প্রক্রিয়া আইডিতে চালান ।

এই ক্ষেত্রে:

bash-4.2$ psig $$
11088:  bash
HUP     caught  termsig_sighandler  0   HUP,INT,ILL,TRAP,ABRT,EMT,FPE,BUS,SEGV,SYS,PIPE,ALRM,TERM,USR1,USR2,VTALRM,XCPU,XFSZ,LOST
INT     caught  sigint_sighandler   0
QUIT    ignored
ILL     caught  termsig_sighandler  0   HUP,INT,ILL,TRAP,ABRT,EMT,FPE,BUS,SEGV,SYS,PIPE,ALRM,TERM,USR1,USR2,VTALRM,XCPU,XFSZ,LOST
TRAP    caught  termsig_sighandler  0   HUP,INT,ILL,TRAP,ABRT,EMT,FPE,BUS,SEGV,SYS,PIPE,ALRM,TERM,USR1,USR2,VTALRM,XCPU,XFSZ,LOST
ABRT    caught  termsig_sighandler  0   HUP,INT,ILL,TRAP,ABRT,EMT,FPE,BUS,SEGV,SYS,PIPE,ALRM,TERM,USR1,USR2,VTALRM,XCPU,XFSZ,LOST
EMT     caught  termsig_sighandler  0   HUP,INT,ILL,TRAP,ABRT,EMT,FPE,BUS,SEGV,SYS,PIPE,ALRM,TERM,USR1,USR2,VTALRM,XCPU,XFSZ,LOST
FPE     caught  termsig_sighandler  0   HUP,INT,ILL,TRAP,ABRT,EMT,FPE,BUS,SEGV,SYS,PIPE,ALRM,TERM,USR1,USR2,VTALRM,XCPU,XFSZ,LOST
KILL    default
BUS     caught  termsig_sighandler  0   HUP,INT,ILL,TRAP,ABRT,EMT,FPE,BUS,SEGV,SYS,PIPE,ALRM,TERM,USR1,USR2,VTALRM,XCPU,XFSZ,LOST
SEGV    caught  termsig_sighandler  0   HUP,INT,ILL,TRAP,ABRT,EMT,FPE,BUS,SEGV,SYS,PIPE,ALRM,TERM,USR1,USR2,VTALRM,XCPU,XFSZ,LOST
SYS     caught  termsig_sighandler  0   HUP,INT,ILL,TRAP,ABRT,EMT,FPE,BUS,SEGV,SYS,PIPE,ALRM,TERM,USR1,USR2,VTALRM,XCPU,XFSZ,LOST
PIPE    caught  termsig_sighandler  0   HUP,INT,ILL,TRAP,ABRT,EMT,FPE,BUS,SEGV,SYS,PIPE,ALRM,TERM,USR1,USR2,VTALRM,XCPU,XFSZ,LOST
ALRM    caught  termsig_sighandler  0   HUP,INT,ILL,TRAP,ABRT,EMT,FPE,BUS,SEGV,SYS,PIPE,ALRM,TERM,USR1,USR2,VTALRM,XCPU,XFSZ,LOST
TERM    ignored
USR1    caught  termsig_sighandler  0   HUP,INT,ILL,TRAP,ABRT,EMT,FPE,BUS,SEGV,SYS,PIPE,ALRM,TERM,USR1,USR2,VTALRM,XCPU,XFSZ,LOST
USR2    caught  termsig_sighandler  0   HUP,INT,ILL,TRAP,ABRT,EMT,FPE,BUS,SEGV,SYS,PIPE,ALRM,TERM,USR1,USR2,VTALRM,XCPU,XFSZ,LOST
CLD     blocked,caught  0x4898e8    RESTART
PWR     default
WINCH   caught  sigwinch_sighandler 0
[...]

যা দেখায় যে সিগআপ, সিগিল ইত্যাদি সমস্ত একই সিগন্যাল হ্যান্ডলার ফাংশনটির দ্বারা ধরা পড়বে termsig_sighandler, যেগুলির মাধ্যমে নির্ধারিত কোনও পতাকা ব্যবহার না করে চালানো sigactionহবে এবং সিগন্যাল হ্যান্ডলার থাকাকালীন সমস্ত সংকেত অস্থায়ীভাবে মুখোশযুক্ত হবে all চলমান (এক্ষেত্রে সমস্ত একই সিগন্যাল হ্যান্ডলার ব্যবহার করে, সুতরাং এটি ইতিমধ্যে চলাকালীন পুনরায় সাজানো হয়নি)। এছাড়াও আপনি দেখতে পাবেন যে সিকুইট এবং সিগন্টর এড়িয়ে যাওয়া হবে, সিগ্কিল এবং সিগ্পডাব্লুআর সিস্টেম ডিফল্ট সিগন্যাল ক্রিয়াগুলি ব্যবহার করে এবং সিগসিএলডি রিস্টার্ট পতাকা নির্দিষ্ট করে, তাই যদি এটির সিগন্যাল হ্যান্ডলারটি কোনও সিস্টেম কলকে বাধা দেয়, সিস্কেলটি পুনরায় চালু হবে।


অসাধারণ! আমি আশা করছিলাম যে কেউ একটি নন-লিনাক্স উত্তর যুক্ত করবেন।
জেন্ডার

4

(এই উত্তরটি @ ব্যবহারকারী18096 এর উত্তরের অনুরূপ, এটি @ জান্দারের উত্তরকে ঘিরে একটি লিপি তৈরি করে))

আমি psig scriptএকটি পিআইডি (বা সমস্ত পিআইডি) নিতে এবং সিগন্যাল মাস্কগুলি থেকে মানব-পঠনযোগ্য আউটপুট তৈরি করতে একটি লিখেছি /proc/<PID>/status

উদাহরণ আউটপুট:

% ./psig -a
[     1] Signals Queued: 8/773737
[     1] Signals Pending:
[     1] Signals Pending (Shared):
[     1] Signals Blocked:
[     1] Signals Ignored: SIGPIPE
[     1] Signals Caught: SIGHUP,SIGINT,SIGABRT,SIGUSR1,SIGSEGV,SIGALRM,SIGTERM,SIGCHLD,SIGPWR
...
[ 31001] Signals Queued: 0/773737
[ 31001] Signals Pending:
[ 31001] Signals Pending (Shared):
[ 31001] Signals Blocked: SIGHUP,SIGINT,SIGQUIT,SIGILL,SIGTRAP,SIGABRT,SIGBUS,SIGFPE,SIGUSR1,SIGUSR2,SIGPIPE,SIGALRM,SIGTERM,SIGSTKFLT,SIGCHLD,SIGCONT,SIGTSTP,SIGTTIN,SIGTTOU,SIGURG,SIGXCPU,SIGXFSZ,SIGPROF,SIGWINCH,SIGIO,SIGPWR,SIGSYS,SIGRTMIN,SIGRTMIN+1,SIGRTMIN+2,SIGRTMIN+3,SIGRTMIN+4,SIGRTMIN+5,SIGRTMIN+6,SIGRTMIN+7,SIGRTMIN+8,SIGRTMIN+9,SIGRTMIN+10,SIGRTMIN+11,SIGRTMIN+12,SIGRTMIN+13,SIGRTMIN+14,SIGRTMIN+15,SIGRTMAX-14,SIGRTMAX-13,SIGRTMAX-12,SIGRTMAX-11,SIGRTMAX-10,SIGRTMAX-9,SIGRTMAX-8,SIGRTMAX-7,SIGRTMAX-6,SIGRTMAX-5,SIGRTMAX-4,SIGRTMAX-3,SIGRTMAX-2,SIGRTMAX-1,SIGRTMAX
[ 31001] Signals Ignored: SIGHUP,SIGINT,SIGQUIT,SIGPIPE,SIGXFSZ
[ 31001] Signals Caught: SIGBUS,SIGUSR1,SIGSEGV,SIGUSR2,SIGALRM,SIGTERM,SIGVTALRM

আদেশ সহকারে:

  • এই হল একটি Linux নির্দিষ্ট উত্তর।
  • স্ক্রিপ্টটি চালনার জন্য তুলনামূলকভাবে নতুন পাইথন সংস্করণ প্রয়োজন হতে পারে, এটি ব্যবহার করে withএবং OrderedDict

2

আমি @ জান্ডারের সুন্দর উত্তরটিতে ফিরে আসছি যখন এর মতো মুখোমুখি হ'ল অনুলিপি-অনুলিপিের অনুলিপিটির প্রত্যাশায়:

user@machine:~$ grep Sig...: /proc/18475/status
SigPnd: 0000000000000000
SigBlk: fffffffe7dfbfaff
SigIgn: 0000000000001000
SigCgt: 0000000182006e47
user@machine:~$ 

অনুমান করুন আমাকে কিছুটা কড়াতে হবে ... বলুন:

user@machine:~$ ruby -wn - /proc/18475/status <<'EOF'
if $_.match(/Sig(Pnd|Blk|Ign|Cgt):\s([0-9a-f]{16})/) == nil
  next
end
field = $1
mask = $2.to_i(16)
names = []
Signal.list().each_pair() {
  |name, number|
  if number == 0
    # "EXIT" => 0
    next
  end
  if (mask & (1 << (number - 1))) == 0
    next
  end
  names << name
}
puts("Sig#{field}: #{names.join(" | ")}")
EOF
SigPnd: 
SigBlk: HUP | INT | QUIT | ILL | TRAP | IOT | ABRT | FPE | BUS | SYS | PIPE | ALRM | TERM | URG | TSTP | CONT | CHLD | CLD | TTIN | TTOU | IO | XCPU | XFSZ | PROF | WINCH | USR1 | USR2 | PWR | POLL
SigIgn: PIPE
SigCgt: HUP | INT | QUIT | BUS | SEGV | ALRM | TERM | VTALRM | USR1 | USR2
user@machine:~$ 

আমি চেয়েছিলাম এটি কিছুটা সুগঠিত হোক, তবে এটি আমার পছন্দের চেয়ে প্রার্থনা করা কিছুটা ক্ল্যামিয়ার করে তুলেছে, সুতরাং @ অ্যালাঙ্কের পরামর্শের জন্য ধন্যবাদ, আমি এটিকে ~ / bin / psig হিসাবে সংরক্ষণ করব।


2

ব্যবহার এই(লিঙ্কটি ভাঙ্গা) এই লাইব্রেরিতে চাকরি সম্পর্কে ইনফস পেতে, যা চলছে।

struct Jobসংকেতগুলির জন্য একটি বিশেষ ক্ষেত্র রয়েছে , বলা হয়sigCgt

আপনি এই জাতীয় কিছু ব্যবহার করতে পারেন:

#include"read_proc.h"
int main(void)
{
    struct Root * rt=read_proc();
    struct Job * jb=rt->first->job;
    printf("%ull\n",jb->sigCgt);
    return 0;
}

আমি পছন্দ করি তবে লিঙ্কটি নষ্ট হয়ে গেছে।
মাইকেল ফক্স

1
@ মিশেলফক্স আমার সম্পাদনা দেখুন। ব্যবহারকারী তার অ্যাকাউন্ট মুছে ফেলেছে। নতুন লিঙ্কটি একই প্রকল্পের দিকে নির্দেশ করে
লিটলবাই ব্লু

1

ফ্রিবিএসডি-তে, procstat -i <PID>কোন সংকেতগুলি প্রক্রিয়া দ্বারা উপেক্ষা করা হবে তা দেখার জন্য ব্যবহার করুন । একইভাবে, procstat -j <PID>প্রক্রিয়া থ্রেড দ্বারা কোন সংকেতগুলি অবরুদ্ধ রয়েছে তা দেখতে। উভয় কমান্ডই সিগন্যাল মুলতুবি রয়েছে কিনা তা দেখায়।

নমুনা আউটপুট:

$ procstat -i 38540 PID COMM SIG FLAGS 38540 nsulfd HUP -I- 38540 nsulfd INT -I- 38540 nsulfd QUIT -I- 38540 nsulfd ILL --- 38540 nsulfd TRAP --- ...

$ procstat -j 38540 PID TID COMM SIG FLAGS 38540 101220 nsulfd HUP -- 38540 101220 nsulfd INT -- 38540 101220 nsulfd QUIT -B 38540 101220 nsulfd ILL -- 38540 101220 nsulfd TRAP -- ...

দেখুন procstat (1)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.