Yanıtlar:
kill -STOP $PID
[...]
kill -CONT $PID
@jordanm ekler: SIGKILL ( kill -9
) gibi SIGSTOP'un da göz ardı edilemeyeceğini unutmayın .
(Yinelenen / kapalı soruyu da yanıtlamak için Çalıştırma işlemini nasıl duraklatabilir veya dondurabilirim? Uygulamalar devam ettikten sonra ne zaman çökeceklerini sorabilirim.)
kill -STOP $PID
& İşaretinden sonra düzgün şekilde devam etmeyen işlemler var kill -CONT $PID
. Bu durumda, CRIU ile kontrol noktası / geri yüklemeyi deneyebilirsiniz . Yükü dikkate almazsanız, işlemi askıya alabileceğiniz sanal bir makinede de çalıştırabilirsiniz.
SIGSTOP / SIGCONT'dan sonra bir işlemin devam etmemesinin bir nedeni, işlem durdurulduğunda ve daha sonra SIGCONT aracılığıyla sürdürüldüğünde Linux üzerindeki bazı engelleme sistemi çağrılarının EINTR ile başarısız olması olabilir. Gönderen sinyali (7) :
Sistem çağrılarının ve kütüphane işlevlerinin durdurma sinyalleri ile kesilmesi
Linux'ta, sinyal işleyicilerin yokluğunda bile, işlem durdurma sinyallerinden biri tarafından durdurulduktan ve daha sonra SIGCONT üzerinden yeniden başlatıldıktan sonra belirli engelleme arabirimleri EINTR hatasıyla başarısız olabilir. Bu davranış POSIX.1 tarafından onaylanmamıştır ve diğer sistemlerde oluşmaz.
[...]
Etkilenen sistem çağrılarından biri epoll_wait (2) . Misal:
#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;
}
Derleyin ve çalıştırın:
$ gcc -o example example.c
$ echo 'input' | ./example
Received input
$ ./example
Ctrl+Z
[1]+ Stopped ./example
$ fg
./example
epoll_wait: Interrupted system call
Pkill komutunuSTOP
ve CONT
sinyalleri işlem adlarına göndermek için kullanabilirsiniz , böylece PID'yi bulmanıza gerek kalmaz.
Bir işlemi ada göre askıya almak için:
pkill --signal STOP ProcessNameToSuspend
Bu işlemi yedeklemek için:
pkill --signal CONT ProcessNameToSuspend
Standart sistemlerde , diğer tüm komut öğelerinin yanı sıra - için de TABtamamlama vardır ProcessName
.
EINTR
geldiğini belirtirSIGCONT
. ProgramSIGCONT
gönderilinceye kadar durur