সংক্ষিপ্ত উত্তর
ইন bash
(এবং dash
) বিভিন্ন "কাজ স্থিতি" বার্তা সংকেত হ্যান্ডলার থেকে প্রদর্শিত হয় না, কিন্তু একটি সুনির্দিষ্ট চেক প্রয়োজন। কোনও নতুন প্রম্পট সরবরাহ করার আগেই এই চেকটি সঞ্চালিত হয়, সম্ভবত কোনও নতুন কমান্ড টাইপ করার সময় ব্যবহারকারীকে বিরক্ত করবেন না।
kill
প্রসেসটি প্রদর্শিত হওয়ার পরে প্রম্পটের ঠিক আগে ম্যাসেজটি প্রদর্শিত হয় না কারণ সম্ভবত প্রক্রিয়াটি এখনও মারা যায় নি - kill
এটি শেলটির একটি অভ্যন্তরীণ কমান্ড হওয়ায় এটি সম্ভবত সম্ভাব্য শর্ত , সুতরাং এটি কার্যকর করা খুব দ্রুত এবং কাঁটাচামচ করার দরকার নেই।
একই পরীক্ষার killall
পরিবর্তে সাধারণত "নিহত" বার্তাটি সঙ্গে সঙ্গেই পাওয়া যায়, স্বাক্ষর করুন যে সময় / প্রসঙ্গটি স্যুইচ / বাহ্যিক কমান্ড কার্যকর করার জন্য যা কিছু প্রয়োজন তা শেলটিতে ফিরে আসার আগে প্রক্রিয়াটি মারা যাওয়ার জন্য যথেষ্ট বিলম্ব ঘটায় ।
matteo@teokubuntu:~$ dash
$ sleep 60 &
$ ps
PID TTY TIME CMD
4540 pts/3 00:00:00 bash
4811 pts/3 00:00:00 sh
4812 pts/3 00:00:00 sleep
4813 pts/3 00:00:00 ps
$ kill -9 4812
$
[1] + Killed sleep 60
$ sleep 60 &
$ killall sleep
[1] + Terminated sleep 60
$
দীর্ঘ উত্তর
dash
প্রথমত, dash
উত্সগুলিতে আমার নজর ছিল , যেহেতু dash
একই আচরণ এবং কোডটি অবশ্যই এর চেয়ে সহজ bash
।
উপরে যেমন বলা হয়েছে, বিন্দুটি মনে হচ্ছে যে জব স্ট্যাটাস বার্তাগুলি একটি সিগন্যাল হ্যান্ডলার থেকে নির্গত হয় না (যা "সাধারণ" শেল নিয়ন্ত্রণ প্রবাহকে বাধাগ্রস্ত করতে পারে), তবে এগুলি সম্পাদিত একটি স্পষ্ট চেক ( showjobs(out2, SHOW_CHANGED)
কল ইন dash
) এর পরিণাম কেবলমাত্র REPL লুপে ব্যবহারকারীর কাছ থেকে নতুন ইনপুট অনুরোধ করার আগে।
সুতরাং, ব্যবহারকারীর ইনপুটটির জন্য শেলটি অবরুদ্ধ থাকলে এই জাতীয় কোনও বার্তা প্রবাহিত হয় না।
এখন, হত্যার ঠিক পরে পরীক্ষাটি কেন সঞ্চালিত হয় না যে প্রক্রিয়াটি আসলে বন্ধ হয়ে গেছে? উপরে বর্ণিত হিসাবে, সম্ভবত এটি খুব দ্রুত। kill
এটি শেলের একটি অভ্যন্তরীণ কমান্ড, সুতরাং এটি কার্যকর করা খুব দ্রুত এবং কাঁটাচামচ করা দরকার হয় না, এইভাবে, যখন kill
চেকটি সঞ্চালনের অবিলম্বে , প্রক্রিয়াটি এখনও বেঁচে থাকে (বা, অন্তত এখনও নিহত হচ্ছে)।
bash
যেমনটি প্রত্যাশা করা হয়েছিল, bash
আরও জটিল শেল হ'ল, তাত্পর্যপূর্ণ ছিল এবং এর জন্য কিছু- gdb
ফু প্রয়োজন ছিল ।
এই বার্তাটি যখন প্রকাশিত হয় তার ব্যাকট্র্যাসটি হ'ল কিছু
(gdb) bt
#0 pretty_print_job (job_index=job_index@entry=0, format=format@entry=0, stream=0x7ffff7bd01a0 <_IO_2_1_stderr_>) at jobs.c:1630
#1 0x000000000044030a in notify_of_job_status () at jobs.c:3561
#2 notify_of_job_status () at jobs.c:3461
#3 0x0000000000441e97 in notify_and_cleanup () at jobs.c:2664
#4 0x00000000004205e1 in shell_getc (remove_quoted_newline=1) at /Users/chet/src/bash/src/parse.y:2213
#5 shell_getc (remove_quoted_newline=1) at /Users/chet/src/bash/src/parse.y:2159
#6 0x0000000000423316 in read_token (command=<optimized out>) at /Users/chet/src/bash/src/parse.y:2908
#7 read_token (command=0) at /Users/chet/src/bash/src/parse.y:2859
#8 0x00000000004268e4 in yylex () at /Users/chet/src/bash/src/parse.y:2517
#9 yyparse () at y.tab.c:2014
#10 0x000000000041df6a in parse_command () at eval.c:228
#11 0x000000000041e036 in read_command () at eval.c:272
#12 0x000000000041e27f in reader_loop () at eval.c:137
#13 0x000000000041c6fd in main (argc=1, argv=0x7fffffffdf48, env=0x7fffffffdf58) at shell.c:749
কল যেটি মৃত চাকরি ও সহ জন্য পরীক্ষা করে। হয় notify_of_job_status
(এটা বেশী বা কম সমতুল্য এর showjobs(..., SHOW_CHANGED)
মধ্যে dash
); # 0- # 1 এর অভ্যন্তরীণ কাজের সাথে সম্পর্কিত; 6-8 হ'ল ইয়্যাক-উত্পন্ন পার্সার কোড; 10-12 হল REPL লুপ op
আকর্ষণীয় জায়গাটি এখানে # 4, যেখানে notify_and_cleanup
কলটি আসে সেখান থেকে । দেখে মনে হচ্ছে bash
, বিপরীতে dash
, কমান্ড লাইন থেকে পড়া প্রতিটি চরিত্রের মধ্যে সমাপ্ত চাকরির জন্য পরীক্ষা করতে পারে তবে আমি যা পেয়েছি তা এখানে:
/* If the shell is interatctive, but not currently printing a prompt
(interactive_shell && interactive == 0), we don't want to print
notifies or cleanup the jobs -- we want to defer it until we do
print the next prompt. */
if (interactive_shell == 0 || SHOULD_PROMPT())
{
#if defined (JOB_CONTROL)
/* This can cause a problem when reading a command as the result
of a trap, when the trap is called from flush_child. This call
had better not cause jobs to disappear from the job table in
that case, or we will have big trouble. */
notify_and_cleanup ();
#else /* !JOB_CONTROL */
cleanup_dead_jobs ();
#endif /* !JOB_CONTROL */
}
সুতরাং, ইন্টারেক্টিভ মোডে একটি নতুন প্রম্পট সরবরাহ না করা পর্যন্ত চেকটি বিলম্ব করা ইচ্ছাকৃত , সম্ভবত ব্যবহারকারীকে কমান্ডগুলি প্রবেশ করতে বিরক্ত করবেন না। যেহেতু চেকটি নতুন প্রম্পটটি তাত্ক্ষণিকভাবে প্রদর্শন করার পরে মৃত প্রক্রিয়াটিকে চিহ্নিত করে না kill
, পূর্ববর্তী ব্যাখ্যাটি ধরে রয়েছে (প্রক্রিয়াটি এখনও মৃত নয়)।
pid="$(sh -c 'cat "$fileName" |less & echo ${!}')"
তবে কম দেখানো হবে না