প্রক্রিয়াটিকে হত্যা না করে স্থগিত করুন


11

সুতরাং আমি একটি অবিরাম প্রোগ্রাম পটভূমি চলমান পেয়েছি। এটি মেরে ফেলার কারণে এটি অন্য একটি পিআইডি দিয়ে পুনরায় আরম্ভ করতে পারে। আমি এটিকে স্থগিত করতে চাই (এটি আসলে না মেরে ঘুমিয়ে রাখি)। মেরুন -9 এটা কি করে? যদি না হয় তবে এটি কীভাবে করা উচিত?

উত্তর:


14
kill -STOP $PID
[...]
kill -CONT $PID

@ জোর্ডানম যোগ করেছেন: এছাড়াও মনে রাখবেন যে kill -9সিগকল ( ) এর মতো, সিগস্টপও এড়ানো যাবে না


4

(সদৃশ / বদ্ধ প্রশ্নের উত্তর দেওয়ার জন্য আমি কোনও চলমান প্রক্রিয়া কীভাবে বিরতি দিতে পারি বা হিমায়িত করতে পারি? পুনরায় শুরু হওয়ার পরে অ্যাপ্লিকেশন ক্র্যাশ হলে কী করা উচিত তা জিজ্ঞাসা করে))

এমন প্রক্রিয়া রয়েছে যা kill -STOP $PID& এর পরে যথাযথভাবে পুনরায় শুরু হয় না kill -CONT $PID। যদি এটি হয় তবে আপনি সিআরআইইউ দিয়ে চেকপয়েন্ট / পুনরুদ্ধার করতে পারেন । যদি আপনি ওভারহেডকে কিছু মনে না করেন তবে আপনি কোনও ভার্চুয়াল মেশিনে প্রক্রিয়াটি চালাতে পারেন, যা আপনি স্থগিত করতে পারেন।

সিগস্টপ / সিগনকন্টের পরে কোনও প্রক্রিয়া পুনরায় শুরু না হওয়ার একটি কারণ হ'ল প্রক্রিয়াটি বন্ধ হয়ে যাওয়ার পরে লিনাক্সে কিছু ব্লকিং সিস্টেম কল EINTR এর সাথে ব্যর্থ হয় এবং তারপরে আবার SIGCONT এর মাধ্যমে পুনরায় শুরু হয়। সংকেত থেকে (7) :

স্টপ সিগন্যালের মাধ্যমে সিস্টেম কল এবং লাইব্রেরি ফাংশনগুলিতে বাধা

লিনাক্সে, এমনকি সিগন্যাল হ্যান্ডলারের অনুপস্থিতিতেও কিছু নির্দিষ্ট ব্লকিং ইন্টারফেস EINTR ত্রুটির সাথে ব্যর্থ হতে পারে প্রক্রিয়াটি স্টপ সিগন্যালের একটি দ্বারা থামিয়ে দেওয়া হয় এবং তারপরে আবার সিগনকন্টের মাধ্যমে পুনরায় শুরু করা হয়। এই আচরণটি POSIX.1 দ্বারা অনুমোদিত হয় না এবং অন্যান্য সিস্টেমে ঘটে না।

[...]

প্রভাবিত সিস্টেম কলগুলির মধ্যে একটি হ'ল এপল_উইট (2) । উদাহরণ:

#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <sys/epoll.h>

int
main(int argc, char *argv[])
{
    int fd = 0;

    int efd = epoll_create(1);
    if (efd == -1) {
        perror("epoll_create");
        exit(1);
    }

    struct epoll_event ev;
    memset(&ev, 0, sizeof(ev));
    ev.events = EPOLLIN;
    ev.data.fd = fd;

    if (epoll_ctl(efd, EPOLL_CTL_ADD, fd, &ev) == -1) {
        perror("epoll_ctl");
        exit(1);
    }

    int res = epoll_wait(efd, &ev, 1, -1);
    if (res == -1) {
        perror("epoll_wait");
        exit(1);
    }

    if (ev.events & EPOLLIN && ev.data.fd == fd) {
        printf("Received input\n");
    }

    return 0;
}

সংকলন এবং চালান:

$ gcc -o example example.c
$ echo 'input' | ./example
Received input
$ ./example
Ctrl+Z
[1]+  Stopped                 ./example
$ fg
./example
epoll_wait: Interrupted system call

মজাদার. আপনি দয়া করে কোন উদাহরণ প্রদান করতে সক্ষম হন?
রোয়াইমা

> এবং তারপরে সিগকন্টের মাধ্যমে পুনরায় শুরু করা হয়েছে <এটি বলছে যে থামানো প্রক্রিয়াতে প্রেরিত EINTRহলে সিস্টেম কল আসে gets SIGCONTপ্রোগ্রামটি SIGCONTপ্রেরণ না হওয়া পর্যন্ত বন্ধ থাকে
মায়াট

0

আপনি ব্যবহার করতে পারেন pkill পাঠাতে STOPএবং CONTপ্রক্রিয়া-নাম সংকেত, যাতে আপনি PID, খুঁজে বের করতে হবে না।

নাম অনুসারে একটি প্রক্রিয়া স্থগিত করার জন্য:

 pkill --signal STOP ProcessNameToSuspend

এই প্রক্রিয়াটি ব্যাক আপ জাগাতে:

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