উত্তর:
kill -STOP $PID
[...]
kill -CONT $PID
@ জোর্ডানম যোগ করেছেন: এছাড়াও মনে রাখবেন যে kill -9
সিগকল ( ) এর মতো, সিগস্টপও এড়ানো যাবে না ।
(সদৃশ / বদ্ধ প্রশ্নের উত্তর দেওয়ার জন্য আমি কোনও চলমান প্রক্রিয়া কীভাবে বিরতি দিতে পারি বা হিমায়িত করতে পারি? পুনরায় শুরু হওয়ার পরে অ্যাপ্লিকেশন ক্র্যাশ হলে কী করা উচিত তা জিজ্ঞাসা করে))
এমন প্রক্রিয়া রয়েছে যা 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
প্রেরণ না হওয়া পর্যন্ত বন্ধ থাকে
আপনি ব্যবহার করতে পারেন pkill পাঠাতে STOP
এবং CONT
প্রক্রিয়া-নাম সংকেত, যাতে আপনি PID, খুঁজে বের করতে হবে না।
নাম অনুসারে একটি প্রক্রিয়া স্থগিত করার জন্য:
pkill --signal STOP ProcessNameToSuspend
এই প্রক্রিয়াটি ব্যাক আপ জাগাতে:
pkill --signal CONT ProcessNameToSuspend