জাভাতে কীভাবে সৃগিল সিগন্যালটি পরিচালনা করবেন


113

প্রোগ্রামটি যখন একটি কিল সংকেত পেয়ে থাকে তখন আপনি কীভাবে সাফ পরিচালনা করবেন?

উদাহরণস্বরূপ, আমার সাথে সংযুক্ত একটি অ্যাপ্লিকেশন রয়েছে যা finishলগ আউট করার সময় কোনও তৃতীয় পক্ষের অ্যাপ্লিকেশন (আমার অ্যাপ্লিকেশন) কোনও আদেশ পাঠাতে চায় । finishআমার অ্যাপ্লিকেশনটি একটি দিয়ে ধ্বংস হয়ে গেলে সেই আদেশটি পাঠানোর জন্য সেরা কী বলে kill -9?

সম্পাদনা 1: কিল -9 ক্যাপচার করা যায় না। আমাকে সংশোধন করার জন্য আপনাকে ধন্যবাদ

2 সম্পাদনা করুন: আমার ধারণা এই ক্ষেত্রেটি তখন ঘটবে যখন একটি কল কেবল খুন করবে যা সিটিআরএল-সি এর সমান


44
kill -9আমার কাছে বোঝানো হয়েছে: "শুরু হয়ে গেল, ফাউল প্রক্রিয়া, তোমার সাথে দূরে!", যার প্রক্রিয়াটি থেমে থাকবে। অবিলম্বে।
ZoogieZork

11
সবচেয়ে * nixes যে আমি হত্যার সচেতন আছি উপর -9 বাধাপ্রাপ্ত করা যাবে না এবং অত্যন্ত শৃঙ্খলার কোনও প্রোগ্রাম কোন ব্যাপার কি ভাষা এটা লেখা ছিল দ্বারা পরিচালিত।
প্রেসিডেন্ট জেমস কে Polk

2
@ বেগুই: অন্যরা যা মন্তব্য করেছে এবং জবাব দিয়েছে সেগুলি ছাড়াও, যদি আপনার ইউএন এক্স ওএস তাত্ক্ষণিকভাবে হত্যা না করে * এবং প্রোগ্রামটির দ্বারা ব্যবহৃত সমস্ত উত্সগুলি রক্ষা করুন -9'এড , ভাল ... ওএসটি নষ্ট হয়ে গেছে।
সিনট্যাক্স T3rr0r

1
কিল -9 কমান্ড সম্পর্কে, ম্যানপেজটি আরও স্পষ্টভাবে বলেছে: "9 কিল (নন-ক্যাচল, অজানা কিল)"। ওএস দ্বারা পরিচালিত একটি সংকেত সাইন করুন, অ্যাপ্লিকেশনটি নয়।
ব্যবহারকারী 1338062

4
ঠিক killকোনটি killসিআরটিএল-সি এর মতো নয়, কোন সিগন্যাল প্রেরণ করা হবে তা সাইনটার্ম প্রেরণ করবে তা নির্দিষ্ট করে না জানিয়ে, যেখানে সিটিআরএল-সি স্বাক্ষর প্রেরণ করে।
alesguzik

উত্তর:


136

কোনও প্রোগ্রামের পক্ষে, কোনও ভাষায়ই, একটি সিক্কিল পরিচালনা করা অসম্ভব । এটি তাই প্রোগ্রামটি বগি বা দূষিত হলেও কোনও প্রোগ্রামের সমাপ্তি সর্বদা সম্ভব। তবে প্রোগ্রামটি বন্ধ করার একমাত্র মাধ্যম সিগ্কিল নয়। অন্যটি হ'ল একটি সিগনেটার ব্যবহার করা। প্রোগ্রামগুলি সেই সংকেতটি পরিচালনা করতে পারে। প্রোগ্রাম উচিত একটি নিয়ন্ত্রিত, কিন্তু দ্রুত, শাটডাউন করে সংকেত হ্যান্ডেল। যখন কোনও কম্পিউটার বন্ধ হয়ে যায়, শাটডাউন প্রক্রিয়াটির চূড়ান্ত পর্যায়ে প্রতিটি অবশিষ্ট প্রক্রিয়াটি একটি SIGTERM প্রেরণ করে, সেই প্রক্রিয়াগুলিকে কয়েক সেকেন্ডের অনুগ্রহ দেয়, তারপরে তাদের একটি সিগিল পাঠায়।

এটি বন্ধ করার হুকটি নিবন্ধকরণ করা ব্যতীত অন্য কোনও কিছুর জন্য এটি হ্যান্ডেল করার উপায় । আপনি যদি ( SIGTERM ) ব্যবহার করতে পারেন তবে শাটডাউন হুক কাজ করবে। ( SIGINT ) শুরু করে অত্যন্ত শৃঙ্খলার প্রস্থান প্রোগ্রাম কারণ ও শাটডাউন আঙ্গুলসমূহ চালানো।kill -9kill -15kill -2

একটি নতুন ভার্চুয়াল-মেশিন শাটডাউন হুক নিবন্ধন করে।

জাভা ভার্চুয়াল মেশিন দুটি ধরণের ইভেন্টের প্রতিক্রিয়া হিসাবে বন্ধ করে দেয়:

  • প্রোগ্রামটি সাধারণত প্রস্থান করে, যখন সর্বশেষ নন-ডেমন থ্রেডটি প্রস্থান হয় বা প্রস্থান (সমতুল্যভাবে, সিস্টেম.এক্সিট) পদ্ধতিটি চালু করা হয়, বা
  • ভার্চুয়াল মেশিনটি কোনও ব্যবহারকারীর বাধাদানের প্রতিক্রিয়া হিসাবে সমাপ্ত হয় যেমন ^ C টাইপ করে বা সিস্টেম-ব্যাপী ইভেন্ট, যেমন ব্যবহারকারী লগঅফ বা সিস্টেম শাটডাউন।

আমি ওএসএক্স 10.6.3 নিম্নলিখিত পরীক্ষা প্রোগ্রাম চেষ্টা এবং উপর kill -9এটা হয়নি না আশানুরূপ শাটডাউন হুক রান। একটি উপর kill -15এটি করেনা শাটডাউন হুক প্রত্যেক সময় চালানো।

public class TestShutdownHook
{
    public static void main(String[] args) throws InterruptedException
    {
        Runtime.getRuntime().addShutdownHook(new Thread()
        {
            @Override
            public void run()
            {
                System.out.println("Shutdown hook ran!");
            }
        });

        while (true)
        {
            Thread.sleep(1000);
        }
    }
}

সত্যিই করুণভাবে kill -9কোনও প্রোগ্রামে পরিচালনা করার কোনও উপায় নেই ।

বিরল পরিস্থিতিতে ভার্চুয়াল মেশিনটি বাতিল হতে পারে, অর্থাৎ, পরিষ্কারভাবে বন্ধ না করে চালানো বন্ধ করুন। এটি তখন ঘটে যখন ভার্চুয়াল মেশিনটি বাহ্যিকভাবে বন্ধ হয়ে যায়, উদাহরণস্বরূপ ইউনিক্সের সিগ্কিল সিগন্যাল বা মাইক্রোসফ্ট উইন্ডোজে টার্মিনেটপ্রসেস কল সহ।

kill -9এটিকে হ্যান্ডেল করার একমাত্র আসল বিকল্পটি হ'ল আপনার প্রধান প্রোগ্রামটি চলে যেতে বা একটি মোড়ক স্ক্রিপ্টটি ব্যবহার করার জন্য অন্য প্রহরী প্রোগ্রাম ওয়াচ করা। আপনি এটি শেল স্ক্রিপ্টের সাহায্যে করতে পারেন psযা তালিকায় আপনার প্রোগ্রামটির সন্ধানের কমান্ডটিকে পোল করেছে এবং এটি অদৃশ্য হয়ে গেলে সেই অনুযায়ী কাজ করতে পারে।

#!/usr/bin/env bash

java TestShutdownHook
wait
# notify your other app that you quit
echo "TestShutdownHook quit"

12

সেখানে হয় দেখতে - কিছু JVMs আপনার নিজের সংকেত হ্যান্ডেল করার উপায় হটস্পট জেভিএম এই নিবন্ধটি উদাহরণস্বরূপ।

সূর্যের অভ্যন্তরীণ ব্যবহারের sun.misc.Signal.handle(Signal, SignalHandler)পদ্ধতি কল আপনার কাছে মত সংকেত না একটি সংকেত হ্যান্ডলার রেজিস্টার করতে সক্ষম, কিন্তু সম্ভবত হয় INTবা TERMতারা JVM দ্বারা ব্যবহার করা হয় না।

যে কোনও সিগন্যাল পরিচালনা করতে সক্ষম হতে আপনাকে জেভিএম থেকে বেরিয়ে অপারেটিং সিস্টেমের অঞ্চলে যেতে হবে।

আমি সাধারণত (উদাহরণস্বরূপ) অস্বাভাবিক সমাপ্তি সনাক্ত করতে যা করি তা হ'ল আমার জেভিএমকে পার্ল স্ক্রিপ্টের অভ্যন্তরে প্রবর্তন করা, তবে স্ক্রিপ্টটি waitpidসিস্টেম কল ব্যবহার করে জেভিএমের জন্য অপেক্ষা করে ।

তারপরে আমি যখনই জেভিএম থেকে বেরিয়ে আসে এবং কেন এটি বেরিয়ে আসে এবং আমি প্রয়োজনীয় ব্যবস্থা নিতে পারি সে সম্পর্কে আমাকে অবহিত করা হয়।


3
নোট আপনি ক্যাপচার করতে পারেন INTএবং TERMসহ sun.misc.Signal, তবে আপনি পরিচালনা করতে পারবেন না QUITকারণ জেভিএম এটি ডিবাগিংয়ের জন্য সংরক্ষণ করে, না KILLকারণ ওএস জেভিএমকে তত্ক্ষণাত বন্ধ করে দেবে। হয় হ্যান্ডেল করার চেষ্টা একটি বাড়াতে হবে IllegalArgumentException
ডিমো 414

12

আমি প্রত্যাশা করব যে JVM কমপক্ষে সংকেতগুলির জন্য এবং প্রয়োগ দ্বারা তৈরি সমস্ত চলমান থ্রেডকে ( ) কৃপায়ভাবে বাধাthread.interrupt() দেয় ।SIGINT (kill -2)SIGTERM (kill -15)

এইভাবে, সিগন্যালটি তাদের কাছে ফরোয়ার্ড করা হবে, মানক উপায়ে একটি সুদৃশ্য থ্রেড বাতিলকরণ এবং উত্স চূড়ান্তকরণের অনুমতি দেয় ।

কিন্তু এই ক্ষেত্রে না হয় অন্তত (আমার জেভিএম বাস্তবায়নের: Java(TM) SE Runtime Environment (build 1.8.0_25-b17), Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode)

অন্যান্য ব্যবহারকারীরা যেমন মন্তব্য করেছেন, শাটডাউন হুকের ব্যবহার বাধ্যতামূলক বলে মনে হচ্ছে।

তো, আমি কীভাবে এটি পরিচালনা করব?

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

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

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

Runtime.getRuntime().addShutdownHook(new Thread() {
    @Override
    public void run() {
        System.out.println("Interrupting threads");
        Set<Thread> runningThreads = Thread.getAllStackTraces().keySet();
        for (Thread th : runningThreads) {
            if (th != Thread.currentThread() 
                && !th.isDaemon() 
                && th.getClass().getName().startsWith("org.brutusin")) {
                System.out.println("Interrupting '" + th.getClass() + "' termination");
                th.interrupt();
            }
        }
        for (Thread th : runningThreads) {
            try {
                if (th != Thread.currentThread() 
                && !th.isDaemon() 
                && th.isInterrupted()) {
                    System.out.println("Waiting '" + th.getName() + "' termination");
                    th.join();
                }
            } catch (InterruptedException ex) {
                System.out.println("Shutdown interrupted");
            }
        }
        System.out.println("Shutdown finished");
    }
});

গিথুবে সম্পূর্ণ পরীক্ষার আবেদন: https://github.com/idelvall/kill-test test


6

আপনি ব্যবহার করতে পারেন Runtime.getRuntime().addShutdownHook(...)তবে আপনাকে কোনও গ্যারান্টি দেওয়া যায় না যে এটি কোনও অবস্থাতেই ডাকা হবে ।


12
তবে কিল -9 এর ক্ষেত্রে এটি প্রায় চলবে না।
রাষ্ট্রপতি জেমস কে। পোলক

1

হত্যার প্রতিক্রিয়া জানাতে একটি উপায় রয়েছে -9: এটি হ'ল একটি পৃথক প্রক্রিয়া রয়েছে যা নিহত হওয়ার প্রক্রিয়াটি পর্যবেক্ষণ করে এবং প্রয়োজনে এটির পরে পরিষ্কার হয়ে যায়। এটি সম্ভবত আইপিসিকে জড়িত করবে এবং এটি বেশ কিছুটা কাজ হবে এবং আপনি একই সাথে উভয় প্রক্রিয়া মেরে এটিকে ওভাররাইড করতে পারেন। আমি ধরে নিয়েছি এটি বেশিরভাগ ক্ষেত্রে ঝামেলার উপযুক্ত হবে না।

যে -9-দিয়ে কোনও প্রক্রিয়া মেরে ফেলেছে সে তাত্ত্বিকভাবে জানতে হবে যে সে কী করছে এবং এটি জিনিসগুলিকে অসামঞ্জস্য অবস্থায় ফেলে থাকতে পারে।

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