回答:
(また、重複した/クローズドの質問に答えるために、実行中のプロセスを一時停止またはフリーズするにはどうすればよいですか?再開後にアプリケーションがクラッシュしたときに何をすべきかを尋ねます。)
kill -STOP $PID
&の後に正しく再開しないプロセスがありますkill -CONT $PID
。その場合は、CRIUでチェックポイント/復元を試すことができます。オーバーヘッドを気にしない場合は、仮想マシンでプロセスを実行することもできます。これは一時停止できます。
SIGSTOP / SIGCONTの後でプロセスが再開しない理由の1つは、Linuxの一部のブロックシステムコールが、プロセスが停止してSIGCONTを介して再開したときにEINTRで失敗することです。以下からの信号(7) :
停止信号によるシステムコールとライブラリ関数の中断
Linuxでは、シグナルハンドラーがない場合でも、プロセスがいずれかの停止シグナルによって停止され、SIGCONTを介して再開された後、特定のブロッキングインターフェイスがエラーEINTRで失敗する可能性があります。この動作はPOSIX.1では認可されておらず、他のシステムでは発生しません。
[...]
影響を受けるシステムコールの1つはepoll_wait(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
にSIGCONT
送信されるとシステムコールが取得されることを示しています プログラムSIGCONT
は送信されるまで停止したままです
pkillを使用してSTOP
とCONT
シグナルをプロセス名に送信できるため、PIDを見つける必要はありません。
名前でプロセスを一時停止するには:
pkill --signal STOP ProcessNameToSuspend
そのプロセスを再開するために:
pkill --signal CONT ProcessNameToSuspend