Jawaban:
kill -STOP $PID
[...]
kill -CONT $PID
@jordanm menambahkan: Juga perhatikan bahwa seperti SIGKILL ( kill -9
), SIGSTOP tidak dapat diabaikan.
(Juga untuk menjawab pertanyaan duplikat / tertutup. Bagaimana saya bisa menjeda atau membekukan proses yang sedang berjalan ? , menanyakan apa yang harus dilakukan ketika aplikasi mogok setelah melanjutkan.)
Ada proses yang tidak dilanjutkan dengan benar setelah kill -STOP $PID
& kill -CONT $PID
. Jika demikian, Anda dapat mencoba pos pemeriksaan / pengembalian dengan CRIU . Jika Anda tidak keberatan dengan overhead Anda juga dapat menjalankan proses di mesin virtual, yang dapat Anda tangguhkan.
Salah satu alasan mengapa suatu proses tidak dilanjutkan setelah SIGSTOP / SIGCONT bisa jadi beberapa sistem pemblokiran panggilan di Linux gagal dengan EINTR ketika proses dihentikan dan kemudian dilanjutkan melalui SIGCONT. Dari sinyal (7) :
Gangguan panggilan sistem dan fungsi pustaka oleh sinyal berhenti
Di Linux, bahkan jika tidak ada penangan sinyal, antarmuka pemblokiran tertentu dapat gagal dengan kesalahan EINTR setelah proses dihentikan oleh salah satu sinyal berhenti dan kemudian dilanjutkan melalui SIGCONT. Perilaku ini tidak disetujui oleh POSIX.1, dan tidak terjadi pada sistem lain.
[...]
Salah satu panggilan sistem yang terpengaruh adalah epoll_wait (2) . Contoh:
#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;
}
Kompilasi dan jalankan:
$ gcc -o example example.c
$ echo 'input' | ./example
Received input
$ ./example
Ctrl+Z
[1]+ Stopped ./example
$ fg
./example
epoll_wait: Interrupted system call
EINTR
saat SIGCONT
dikirim ke proses yang dihentikan. Program tetap berhenti sampai SIGCONT
dikirim
Anda dapat menggunakan pkill untuk mengirim STOP
dan CONT
memberi sinyal ke nama proses, sehingga Anda tidak perlu mencari tahu PID.
Untuk menangguhkan proses dengan nama:
pkill --signal STOP ProcessNameToSuspend
Untuk membangunkan kembali proses itu:
pkill --signal CONT ProcessNameToSuspend