কেন আমি এই প্রক্রিয়াটি লিনাক্সে হত্যা করতে পারি না?


8

সমস্যা

আমি রাস্পিভিড (একটি প্রোগ্রাম যা একটি রাস্পবেরি পাই ক্যামেরা ব্যবহার করে ভিডিও রেকর্ড করে) নামক একটি প্রক্রিয়াটিকে হত্যা করতে চাই তবে আমি তা করতে পারি না ...

এইভাবেই আমি এটি ডাকি:

#!/bin/bash

#Start recording...
raspivid -w 800 -h 600 -t 15000 -o $1 -v -n -rot 270 >> /home/pi/log/camera_output.txt 2>&1 &

#Waiting the video to be complete
sleep 16

#Killing child process
sudo kill -9 $!

#Killing parent process
sudo kill -9 $$

যদি আমি এই প্রক্রিয়াটি অনুসন্ধান করি তবে এটি এখনও রয়েছে:

pi@raspberrypi ~ $ ps -ef | grep raspivid
root      7238     7234  0 21:53 ?        00:00:00 [raspivid]
pi       17096 14925  0 22:05 pts/0    00:00:00 grep --color=auto raspivid

আমি যদি এটি হত্যা করার চেষ্টা করি তবে এটি মারা যায় না। পরিবর্তে এটি প্যারেন্ট পিআইডি 1 তে পরিবর্তন করে:

pi@raspberrypi ~ $ sudo killall raspivid
pi@raspberrypi ~ $ ps -ef | grep raspivid
root      7238     1  0 21:53 ?        00:00:00 [raspivid]
pi       17196 14925  0 22:05 pts/0    00:00:00 grep --color=auto raspivid
pi@raspberrypi ~ $ sudo killall raspivid

পর্যবেক্ষণ:

  1. কলটি কিছুক্ষণের জন্য ঠিক কাজ করে (2 ঘন্টা বা কোনও কিছু) তারপরে এটি ঝুলতে শুরু করে।
  2. কেবল একটি শারীরিক শক্তি বন্ধই সমস্যাটি সমাধান করে। আমি টার্মিনাল দিয়ে রিবুট করতে পারি না (এটি খুব ঝুলিয়ে)

আমার প্রশ্নগুলো:

  1. কেন লিনাক্স প্যারেন্ট পিআইডি 1 এ নিয়োগ করে?
  2. প্রক্রিয়া কেন খুন হতে পারে না? (আমি চেষ্টাও করেছি sudo kill -9 7238)

উত্তর:


2

সমস্যা

আপনার স্ক্রিপ্ট সম্ভবত আপনার আদেশগুলির কারণে জম্বি তৈরি করছে kill -9; জাজলিন উত্তর থেকে যেমন পরামর্শ দেওয়া হয়েছে তেমন জোর করে চাপ না দিয়ে আকস্মিকভাবে কিছু প্রক্রিয়া হত্যার পক্ষে কখনও ভাল অভ্যাস নয়।

থেকে man bashআমরা পড়তে পারি:

<বিচ্ছিন্ন> চিহ্নিত চিহ্নিত প্রক্রিয়াগুলি হ'ল মৃত প্রক্রিয়া (তথাকথিত " জম্বি ") থাকে যা তাদের পিতামাতারা তাদের সঠিকভাবে ধ্বংস করেন নি । অভিভাবক প্রক্রিয়াটি যদি প্রস্থান করে তবে এই প্রক্রিয়াগুলি ডিআই (8) দ্বারা ধ্বংস হয়ে যাবে

# 1 উত্তর: প্রক্রিয়া Init হয়েছে PID, 1 এবং এই লিনাক্স তাদের PID, 1 পিতা বা মাতা নির্ধারণ জন্য (কারণ এটি ধার্য তাদের init )।

উত্তর # 2: এগুলি খালি মারা যাওয়ার কারণে এগুলি হত্যা করা যায় না ... যদি তাদের পিতামাতারা initসম্ভবত কিছু সময় অপেক্ষা করতে পারেন তবে যথেষ্ট।

কোনও সিস্টেম থেকে জম্বিগুলি সরাতে, কমান্ড কমান্ডটি ব্যবহার করে SIGCHLD সিগন্যালটি ম্যানুয়ালি প্যারেন্টের কাছে পাঠানো যেতে পারে। যদি পিতামাতার প্রক্রিয়াটি এখনও জম্বিটি কাটাতে অস্বীকৃতি জানায় তবে পরবর্তী পদক্ষেপটি পিতামাতার প্রক্রিয়াটি সরিয়ে ফেলা হবে। যখন কোনও প্রক্রিয়া তার পিতামাতাকে হারায়, তখন DI তার নতুন পিতামাতায় পরিণত হয়। থ্রি পর্যায়ক্রমে অভিভাবক হিসাবে আরবিতে যে কোনও জম্বি কাটতে অপেক্ষা সিস্টেম কলটি সম্পাদন করে। [1]

শুধু ক্ষেত্রে এই ধারণা একদিন বা অন্য দেখা দেয় দুটো কারণে: থেকে #kill -9 initরুট বিশেষাধিকার সঙ্গে প্রক্রিয়া শারীরিকভাবে সফটওয়্যার সমতুল্য বিদ্যুৎ গ্রিড থেকে কম্পিউটার আন-প্লাগ হয়। [:-)]

তবে জ্যাম্বি প্রক্রিয়াগুলি STAT কলামে ps"জেড" উপস্থিতির মাধ্যমে কমান্ডের আউটপুট সনাক্ত করা যায় । এগুলি সহজে সনাক্ত করতে আপনি নীচের লাইনটি ব্যবহার করতে পারেন

ps -aux | grep Z

লিনাক্স জম্বি বিশ্ব সম্পর্কে কিছু উল্লেখ :


প্যারেন্ট পিআইডি 1 সহ একটি প্রক্রিয়া কোনও জম্বি নয়। কোনও প্রক্রিয়া এই পিতামাতাকে তার পিতামাতাকে হত্যার আগে হত্যা করা হয়। সুতরাং তিনি killallদৃশ্যত পিতামাতাকে হত্যা করছেন, তিনি যে প্রক্রিয়াটি চেয়েছিলেন তা নয়।
বার্মার

<defunct>আপনি তার psআউটপুট কোথায় দেখতে পাচ্ছেন ? এই প্রশ্নের সাথে তার কী সম্পর্ক আছে?
বার্মার

@ বারমার আমি দেখতে পাইনি। দুর্ভাগ্যক্রমে সবসময় সমস্যাটি ঠিক আপনি যেখানে সন্ধান করছেন তা নয় । থেকে BTW $!তিনি kill -9একটি ক্যামেরা সঙ্গে পটভূমি প্রক্রিয়া অপেক্ষা ... পরে একটি ছাড়া sleep 16তিনি পিতা বা মাতা , আচমকা আবার। এটি জম্বিটির গন্ধ পেয়েছিল ... গন্ধ অনুসরণ করে (:-)) আপনি দেখতে পাচ্ছেন যে, নিম্নলিখিতটি তিনি করেছিলেন, শিশুটি এখনও বেঁচে আছে, তবে পিতামাতাকে হত্যা করা হয়েছিল (-9)। kill -9ps -ef
হাস্তুর

1
আমি মনে করি আপনি এতিম প্রক্রিয়াগুলি জম্বি প্রক্রিয়াগুলির সাথে বিভ্রান্ত করছেন, তবে এগুলি সম্পর্কিত নয়।
বার্মার

আবার স্ক্রিপ্টটি খুঁজছেন: এটি kill -9তার নিজস্ব প্রক্রিয়া। এটি নিখুঁতভাবে কল করার পরে এটি মেরে গেছে এবং <বিযুক্ত>> ... আরও ধরে নেওয়া যুক্তিসঙ্গত sudo killall raspivid। এমনকি এটি সম্ভব যে raspividএটি অনাথ থাকা নিজস্ব শিশু প্রক্রিয়া তৈরি করে। BTW এটি " জম্বি কিনা" তা দেখার জন্য "পিএস -অক্স | গ্রেপ জেড" করার পক্ষে যথেষ্ট kill -9এবং মূল স্ক্রিপ্টে প্রক্রিয়াটি এড়াতে এটি যথেষ্ট (পর্যাপ্ত) হওয়া উচিত ।
হাস্তুর

4

1 নম্বর প্রশ্নের উত্তর দিতে:

যখন একটি প্রক্রিয়া শিশু প্রক্রিয়াগুলিকে প্রসারিত করে, বাচ্চাদের প্রত্যেকের নিজস্ব পিআইডি থাকে। প্রতিটি সন্তানের পিপিআইডি (পিতামাতার প্রক্রিয়া আইডি) হ'ল তাদের পিতামাতার প্রক্রিয়ার পিআইডি। যদি পিতামাতার মৃত্যু হয়, তবে সন্তানের প্রক্রিয়াগুলি এতিম হয়। অনাথ প্রসেসগুলি স্বয়ংক্রিয়ভাবে সিস্টেম ইআর প্রক্রিয়া দ্বারা নেওয়া হয় যার 1 পিআইডি থাকে।


0

প্রোগ্রামটিতে সম্ভবত ক্যামেরা ডিভাইসটি খোলা রয়েছে এবং জোর করে এটিকে হত্যা করে আপনি এটিকে সঠিকভাবে পরিষ্কার করতে দেননি, এখন এটি আটকে গেছে।

কয়েকটি পর্যবেক্ষণ:

  • আপনি কি করছেন তা না জানলে -9 দিয়ে শুরু করে কোনও প্রোগ্রাম হত্যা করা সাধারণত ভাল ধারণা নয়। কেবলমাত্র একটি সাধারণ কিল (কোনও বিকল্প নেই) ভাল।
  • আপনার স্ক্রিপ্টে কোনও হত্যার দরকার নেই। আপনি -t 15000ভিডিওর দৈর্ঘ্য নির্দিষ্ট করতে ইতিমধ্যে প্রোগ্রামটিতে চলে এসেছেন, সুতরাং প্রথম কিলটি অপ্রয়োজনীয় হওয়া উচিত। দ্বিতীয় কিলটিও অপ্রয়োজনীয় কারণ স্ক্রিপ্টের শেষে পৌঁছলে শেলটি নিজে থেকে প্রস্থান করবে। প্রোগ্রামটি যদি নিজে থেকে বের হয় না (যেমন এটি হওয়া উচিত) তবে আপনি অন্যান্য সমস্যা পেয়েছেন।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.