লগ-ইন করার সময় পটভূমি প্রক্রিয়াগুলি কী সাইনআপ হয়?


21

এটি এই প্রশ্নের অনুসরণ করা ।

আমি আরও কিছু পরীক্ষা চালিয়েছি; মনে হচ্ছে এটি প্রকৃত কনসোল বা এসএসএইচ এর মাধ্যমে করা হয়েছে কিনা তা সত্যিই কিছু যায় আসে না, কেবল এসসিপি দিয়েই এটি ঘটে না; আমি এটি দিয়ে পরীক্ষাও করেছি cat /dev/zero > /dev/null। আচরণ ঠিক একই রকম:

  • ব্যাকগ্রাউন্ডে একটি প্রক্রিয়া শুরু করুন &(বা এটি ব্যবহার শুরু করার পরে পটভূমিতে রাখুন CTRL-Zএবং bg); এই কাজ করা হয় ব্যবহার না করেইnohup
  • লগ অফ.
  • আবার লগ ইন করুন।
  • প্রক্রিয়াটি এখনও আছে, আনন্দের সাথে চলছে, এবং এখন এটির প্রত্যক্ষ সন্তান init

আমি এসসিপি এবং ক্যাট উভয়ই ছাড়ার বিষয়টি তাত্ক্ষণিকভাবে নিশ্চিত করতে পারি যদি প্রেরণ করা হয় SIGHUP; আমি এটি ব্যবহার করে পরীক্ষা করেছি kill -HUP

সুতরাং, এটি দেখতে সত্যিই দেখে মনে হচ্ছে যে লগঅফের উপর, কমপক্ষে ব্যাকগ্রাউন্ড প্রক্রিয়াগুলিতে SIGHUP প্রেরণ করা হয়নি (সুস্পষ্ট কারণে কোনও অগ্রভাগের সাথে পরীক্ষা করতে পারে না)।

এটি আমার প্রথম দিকে ভিএমওয়্যার ইএসএক্স 3.5 এর সার্ভিস কনসোল দিয়ে ঘটেছিল (যা রেডহ্যাটের উপর ভিত্তি করে) তবে আমি এটি ঠিক সেন্টোস 5.4 এ প্রতিলিপি করতে সক্ষম হয়েছি।

আবার প্রশ্নটি হচ্ছে: লগ-অফ করার পরে, প্রেক্ষাপটে কোনও সাইনআপ পাঠানো উচিত নয়, এমনকি যদি তারা ব্যাকগ্রাউন্ডে চলছে? কেন এমন হচ্ছে না?


সম্পাদন করা

straceকাইলের উত্তর অনুসারে আমি চেক করেছিলাম ।
আমি যেমনটি প্রত্যাশা করেছিলাম, শেলটি যেখানে চালু হয়েছিল সেখানে লগ ইন করার সময় প্রক্রিয়াটি কোনও সংকেত পায় না । সার্ভারের কনসোল ব্যবহার করার সময় এবং এসএসএইচ এর মাধ্যমে উভয়ই এটি ঘটে।


CentOS 7.1-এ ব্যাশ ব্যবহার করে, একটি সহজ শেল স্ক্রিপ্ট লুপ এটি পূর্বগ্রাউন্ডে রেখে দিলে একটি SIGHUP পাবে, তবে টার্মিনালটি মারা গেছে; অন্য টার্মিনাল থেকে স্ট্রেস দেখায়: --- SIGHUP {si_signo=SIGHUP, si_code=SI_USER, si_pid=10676, si_uid=3000090} --- rt_sigreturn() = -1 EINTR (Interrupted system call) rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
মাইক এস

সুতরাং একটি পটভূমি স্ক্রিপ্ট হবে। লুপটি ঘুমের অপেক্ষায় থাকাকালীন টার্মিনালটি বন্ধ রয়েছে তা নোট করুন। শেলটি ছাড়েনি:--- SIGHUP {si_signo=SIGHUP, si_code=SI_USER, si_pid=13944, si_uid=3000090} --- +++ killed by SIGHUP +++
মাইক এস

পরীক্ষার জন্য আমার উত্তর দেখুন। মজার বিষয় হল, আমি আচরণের কারণে কোনও পরিবর্তন দেখিনি huponexit
মাইক এস

উত্তর:


26

উত্তর পাওয়া গেছে।

বেসের জন্য, এটি huponexitশেল বিকল্পের উপর নির্ভর করে , যা বিল্ট-ইন shoptকমান্ড ব্যবহার করে দেখা এবং / অথবা সেট করা যায় ।

দেখে মনে হচ্ছে এই বিকল্পগুলি ডিফল্টরূপে বন্ধ রয়েছে, কমপক্ষে রেডহ্যাট-ভিত্তিক সিস্টেমে।

বেস ম্যান পৃষ্ঠাতে আরও তথ্য :

একটি সাইনআপ প্রাপ্তির পরে শেলটি ডিফল্টরূপে প্রস্থান করে। প্রস্থান করার আগে, একটি ইন্টারেক্টিভ শেল চলমান বা বন্ধ হয়ে সমস্ত কাজগুলিতে SIGHUP কে পুনরায় পাঠায়। স্থগিত করা কাজগুলি তারা SIGHUP প্রাপ্ত তা নিশ্চিত করার জন্য SIGCONT প্রেরণ করা হয়। শেলটি কোনও নির্দিষ্ট জবলে সিগন্যাল প্রেরণ করা থেকে বিরত রাখতে, এটি জঞ্জাল টেবিল থেকে অস্বীকৃত বিল্টিন (নীচে শেল বিল্টিন কম্যান্ডগুলি দেখুন) বা ডিসাউন -h ব্যবহার করে সাইনআপ না পাওয়ার জন্য চিহ্নিত করা উচিত।

যদি হুপোনেক্সিট শেল বিকল্পটি শপ্টের সাথে সেট করা থাকে, তবে ইন্টারঅ্যাকটিভ লগইন শেলটি প্রস্থান করলে ব্যাশ সমস্ত চাকরিতে একটি SIGHUP প্রেরণ করে।


4
যাচাই. যখন আমি একটি "প্রস্থান", "লগআউট", বা সিটিএল-ডি সঞ্চালন করি তখন শিশু প্রকল্প (চাকরি) দীর্ঘশ্বাস ফেলবে না (রুট এবং রেগ ব্যবহারকারী উভয়)। তবে আমি যখন বাশনের বর্তমান প্রক্রিয়াটি মারার জন্য "কিল-হুপ $$" করেছি তখন শিশু প্রসেসটি দীর্ঘশ্বাস ফেলল। আমি তখন হুপোনেক্সিট সেট করেছিলাম এবং প্রস্থানের পরে শিশু প্রক্রিয়াটি সাইনআপ গ্রহণ করেছিল।
CarpeNoctem

3

এটি আমার পরীক্ষায় সাইনআপ পাঠানো হবে:

Shell1:

[kbrandt@kbrandt-opadmin: ~] ssh localhost
[kbrandt@kbrandt-opadmin: ~] perl -e sleep & 
[1] 1121
[kbrandt@kbrandt-opadmin: ~] ps
  PID TTY          TIME CMD
 1034 pts/46   00:00:00 zsh
 1121 pts/46   00:00:00 perl
 1123 pts/46   00:00:00 ps

Shell2:

strace -e trace=signal -p1121

শেল 1 আবার:

[kbrandt@kbrandt-opadmin: ~] exit
zsh: you have running jobs.
[kbrandt@kbrandt-opadmin: ~] exit
zsh: warning: 1 jobs SIGHUPed
Connection to localhost closed.

শেল 2 আবার :

strace -e trace=signal -p1121
Process 1121 attached - interrupt to quit
pause()                                 = ? ERESTARTNOHAND (To be restarted)
--- SIGHUP (Hangup) @ 0 (0) ---
Process 1121 detached

এটি এখনও কেন চালায় ?:
স্টিভেনস দ্বারা ইউনিক্স পরিবেশে উন্নত প্রোগ্রামিং এটি 9.10 বিভাগের অধীন অন্তর্ভুক্ত করেছে: অনাথ প্রক্রিয়া দলসমূহ। সর্বাধিক প্রাসঙ্গিক বিভাগ হচ্ছে:

যেহেতু প্রসেস গ্রুপটি এতিম হয় যখন পিতামাতার অবসান ঘটে, তাই পসিক্স ১. আবশ্যক যে নতুন অনাথ প্রক্রিয়া গ্রুপের প্রতিটি প্রক্রিয়াটি বন্ধ হয়ে গেছে (আমাদের শিশু হিসাবে রয়েছে) হ্যাং-আপ সিগন্যাল (SIGHUP) প্রেরণ করা হবে তার পরে চালিয়ে যাওয়া সংকেত (SIGCONT) )।

এটি হ্যাং-আপ সংকেত প্রক্রিয়া করার পরে বাচ্চাকে চালিয়ে যেতে পারে। হ্যাং-আপ সিগন্যালের জন্য ডিফল্ট ক্রিয়াটি প্রক্রিয়াটি শেষ করা হয়, সুতরাং আমাদের সংকেত ধরার জন্য একটি সিগন্যাল হ্যান্ডলার সরবরাহ করতে হবে। তাই আমরা আশা করি যে সিগ_হুপ ফাংশনের প্রিন্টফটি pr_ids ফাংশনে প্রিন্টফের সামনে উপস্থিত হবে।


তবে আপনি এখানে স্পষ্টভাবে একটি সাইনআপ পাঠিয়েছেন; আমি যেখানে শেলটি থেকে আপনি প্রক্রিয়াটি শুরু করেছিলেন সেখানে লগ অফ করলে কী হয় তা নিয়ে আমি কথা বলছিলাম।
ম্যাসিমো

আমি প্রস্থান টাইপ করার সময় একই ফলাফল, যদিও আমি চাকরি সম্পর্কে একটি সতর্কতা পাই, তবে তারপরে আবার প্রস্থান টাইপ করুন। আমি জেডএসএইচ দিয়ে এটি পরীক্ষা করেছি।
কাইল ব্র্যান্ড্ট

আমি বেস ব্যবহার করছি, এবং এটি সম্ভবত শেলের উপর নির্ভর করে। তবে বাস লগ করার সময় শিশুদের প্রক্রিয়াগুলিতে সাইনআপ পাঠানো উচিত ...
ম্যাসিমো

কাজটি বন্ধ হয়ে থাকলে স্পষ্টতই সিগনকন্ট প্রেরণ করে বাশ, তবে আমি নিশ্চিত করি যে কাজটি বন্ধ না করা থাকলে এটি কিছুই পাঠায় না।
কাইল ব্র্যান্ড্ট

সেন্টোস on.১-তে ব্যাশ ব্যবহার করে, আমি আমার উইন্ডোতে প্রসেসের জন্য একটি প্রেরণকারী পেয়েছি: ১) সাধারণ শেল স্ক্রিপ্ট শুরু করুন (একটি প্রতিধ্বনি এবং একটি ঘুম দিয়ে লুপ), ২) কন্ট্রোল-জেড এটি, ৩) প্রক্রিয়াটি স্ট্রেস করুন অন্য উইন্ডো, 4) আসল টার্মিনাল থেকে প্রস্থান করুন। এটি অভিযোগ করে যে আমার চাকরি চলছে, তারপরে আমার স্ট্রেস শো থেকে বেরিয়ে আসার পরে: $ strace -e signal -p1705 Process 1705 attached --- stopped by SIGTSTP --- --- SIGTERM {si_signo=SIGTERM, si_code=SI_USER, si_pid=791, si_uid=3000090} --- +++ killed by SIGTERM +++ অদ্ভুত, অবশ্যই স্টিভেনসের উদ্ধৃত অংশটির সাথে একমত নয়।
মাইক এস

2

আমি CentOS 7.1 এবং ব্যাশ ব্যবহার করে কিছু পরীক্ষা চালিয়েছি। উল্লেখ্য এর মানে huponexitহল offডিফল্ট ভাবে, আর আমার পরীক্ষার সংখ্যাগরিষ্ঠ জন্য বন্ধ ছিল।

আপনি nohupযখন কোনও টার্মিনালে কাজ শুরু করবেন তখন আপনার প্রয়োজন হবে , কারণ আপনি যদি শেলটি পরিষ্কার না ছাড়াই টার্মিনালটি বন্ধ করেন তবে টার্মিনালটি শ্যালে সিএইচএইচপি সংকেত পাঠায়, যা পরে এটি সমস্ত শিশুদের কাছে প্রেরণ করে। আপনি যদি শেলটি পরিষ্কারভাবে প্রস্থান করেন - এর অর্থ চাকরিটি ইতিমধ্যে পটভূমিতে থাকতে হবে যাতে আপনি exitকমান্ড প্রম্পটে কন্ট্রোল-ডি টাইপ করতে বা হিট করতে পারেন ash বাশ থেকে কোনও ধরণের কোনও সংকেত ব্যাকগ্রাউন্ড জবটিতে প্রেরণ করা হয় না।

টেস্ট:

বন্দর 1

$ echo $$
16779

টার্মিনাল ২

$ strace -e signal -p16779
Process 16779 attached

(টার্মিনাল 1 বন্ধ, টার্মিনাল 2 এ দেখা):

--- SIGHUP {si_signo=SIGHUP, si_code=SI_USER, si_pid=16777, si_uid=3000090} ---
rt_sigprocmask(SIG_BLOCK, [CHLD TSTP TTIN TTOU], [HUP INT ILL TRAP ABRT BUS FPE USR1 SEGV USR2 PIPE ALRM TERM XCPU XFSZ VTALRM SYS], 8) = 0
rt_sigprocmask(SIG_SETMASK, [HUP INT ILL TRAP ABRT BUS FPE USR1 SEGV USR2 PIPE ALRM TERM XCPU XFSZ VTALRM SYS], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [HUP INT ILL TRAP ABRT BUS FPE USR1 SEGV USR2 PIPE ALRM TERM XCPU XFSZ VTALRM SYS], 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [HUP INT ILL TRAP ABRT BUS FPE USR1 SEGV USR2 PIPE ALRM TERM XCPU XFSZ VTALRM SYS], 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [HUP INT ILL TRAP ABRT BUS FPE USR1 SEGV USR2 PIPE ALRM TERM XCPU XFSZ VTALRM SYS], 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [HUP INT ILL TRAP ABRT BUS FPE USR1 SEGV USR2 PIPE ALRM TERM XCPU XFSZ VTALRM SYS], 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [HUP INT ILL TRAP ABRT BUS FPE USR1 SEGV USR2 PIPE ALRM TERM XCPU XFSZ VTALRM SYS], 8) = 0
rt_sigprocmask(SIG_SETMASK, [HUP INT ILL TRAP ABRT BUS FPE USR1 SEGV USR2 PIPE ALRM TERM XCPU XFSZ VTALRM SYS], NULL, 8) = 0
rt_sigaction(SIGHUP, {SIG_DFL, [], SA_RESTORER, 0x7f7ace3d9a00}, {0x456880, [HUP INT ILL TRAP ABRT BUS FPE USR1 SEGV USR2 PIPE ALRM TERM XCPU XFSZ VTALRM SYS], SA_RESTORER, 0x7f7ace3d9a00}, 8) = 0
kill(16779, SIGHUP)                     = 0
rt_sigreturn()                          = -1 EINTR (Interrupted system call)
--- SIGHUP {si_signo=SIGHUP, si_code=SI_USER, si_pid=16779, si_uid=3000090} ---
+++ killed by SIGHUP +++

চাকরী doit.sh:

#!/bin/bash

imhupped() {
        echo "HUP" >> /tmp/outfile
}

trap imhupped SIGHUP

for i in $(seq 1 6); do echo out $i >> /tmp/outfile; sleep 5; done

এটি টার্মিনাল 1 এ পটভূমিতে শুরু করুন:

বন্দর 1

$ ./doit.sh &
[1] 22954

টার্মিনাল 2 এ স্ট্রেস করুন; কয়েক লুপের পরে টার্মিনাল 1 বন্ধ করুন:

টার্মিনাল ২

$ strace -e signal -p22954
Process 22954 attached
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=22980, si_status=0, si_utime=0, si_stime=0} ---
rt_sigreturn()                          = 0
rt_sigaction(SIGINT, {SIG_DFL, [], SA_RESTORER, 0x7f7a5d547a00}, {0x43e4b0, [], SA_RESTORER, 0x7f7a5d547a00}, 8) = 0
...
--- SIGHUP {si_signo=SIGHUP, si_code=SI_USER, si_pid=21685, si_uid=3000090} ---
rt_sigreturn()                          = -1 EINTR (Interrupted system call)
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_KILLED, si_pid=23017, si_status=SIGHUP, si_utime=0, si_stime=0} ---
rt_sigreturn()                          = 0
...

টার্মিনাল 3 এ আউটপুট:

টার্মিনাল 3

out 1
out 2
out 3
HUP
out 4
out 5
out 6

তবে, আপনি যদি প্রস্থান করেন bash, তবে শিশুটিকে কোনও সংকেত না পাঠিয়েই এটি কেবল প্রস্থান করে। টার্মিনালটি প্রস্থান করবে কারণ এতে আর কোনও শিশু নেই, তবে অবশ্যই এইচইপি-র কেউ নেই কারণ শিশু শেলটি ইতিমধ্যে চলে গেছে। SIGINT, SIG_BLOCKএবং SIG_SETMASKআপনি নীচের দেখতে কারণে sleepশেল হবে।

বন্দর 1

$ ./doit.sh &
26275

টার্মিনাল ২

$ strace -e signal -p26275
Process 26275 attached
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=26280, si_status=0, si_utime=0, si_stime=0} ---
rt_sigreturn()                          = 0
rt_sigaction(SIGINT, {SIG_DFL, [], SA_RESTORER, 0x7f5edd3a5a00}, {0x43e4b0, [], SA_RESTORER, 0x7f5edd3a5a00}, 8) = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, [INT CHLD], [], 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigaction(SIGINT, {0x43e4b0, [], SA_RESTORER, 0x7f5edd3a5a00}, {SIG_DFL, [], SA_RESTORER, 0x7f5edd3a5a00}, 8) = 0


(..."exit" is typed in bash, notice no new signals sent...)


rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=26303, si_status=0, si_utime=0, si_stime=0} ---
rt_sigreturn()                          = 0
rt_sigaction(SIGINT, {SIG_DFL, [], SA_RESTORER, 0x7f5edd3a5a00}, {0x43e4b0, [], SA_RESTORER, 0x7f5edd3a5a00}, 8) = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, [INT CHLD], [], 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigaction(SIGINT, {0x43e4b0, [], SA_RESTORER, 0x7f5edd3a5a00}, {SIG_DFL, [], SA_RESTORER, 0x7f5edd3a5a00}, 8) = 0

টার্মিনাল 3, আউটপুট

out 1
out 2
out 3
out 4
out 5
out 6

মজার ব্যাপার হচ্ছে, আমি সেট huponexitসঙ্গে থাকতে হবে shopt -s huponexit; shopt(পর্যালোচনার আধুনিক shopt) তাহলে শেষ টেস্ট সঞ্চালিত, এবং আবার ব্যাশ পটভূমি প্রক্রিয়া কোন সংকেত পাঠানো । এমনকি আরও interstingly, যেমন আমরা ব্যাশ দেখেছি করেনি পটভূমি প্রক্রিয়া সংকেত পাঠাতে পরে এটি একটি টার্মিনাল যে তার মুখে বন্ধ থেকে এটা পেয়েছি। দেখে মনে হচ্ছে যেন huponexitকোনওভাবেই বা অন্য কোনওভাবেই তার জন্মেনি।

আমি আশা করি এটি কমপক্ষে বাশের সুখ সম্পর্কে কোনও রহস্য বা বিভ্রান্তি দূর করে, কখন এবং কীভাবে এইচপি সংকেত পাঠানো হয় about কমপক্ষে আমার পরীক্ষাগুলি আমার জন্য সম্পূর্ণ পুনরুত্পাদনযোগ্য ছিল। বাশের আচরণকে প্রভাবিত করতে পারে এমন অন্য কোনও সেটিংস রয়েছে কিনা তা জানতে আগ্রহী।

এবং, সর্বদা হিসাবে, ওয়াইএসএমভি (আপনার শেল মে পরিবর্তিত হতে পারে)।

সংযোজন ঘ

আমি যখন শেলটি চালিত করি exec /bin/shতখন স্ক্রিপ্টটি এর মতো চালান /bin/sh ./doit.sh &, তারপরে শেলটি পরিষ্কার করে প্রস্থান করুন, ব্যাকগ্রাউন্ড জবটিতে কোনও সংকেত প্রেরণ করা হয় না এবং এটি সমাপ্তির দিকে চালিয়ে যেতে থাকে।

সংযোজন 2

আমি যখন শেলটি চালিত করি exec /bin/cshতখন স্ক্রিপ্টটি এর মতো চালান /bin/sh ./doit.sh &, তারপরে শেলটি পরিষ্কার করে প্রস্থান করুন, ব্যাকগ্রাউন্ড জবটিতে কোনও সংকেত প্রেরণ করা হয় না এবং এটি সমাপ্তির দিকে চালিয়ে যেতে থাকে।


0

আমি লগঅফ করার সময় csh এবং ব্যাকগ্রাউন্ড প্রক্রিয়াগুলি চালিয়ে যেতে থাকি।

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