
だから、バックグラウンドで実行される永続的なプログラムがあります。これを殺すと、別のPIDで再起動されます。一時停止したいです(実際に殺さずに省電力モードに設定)。 Kill-9はこれを行うことができますか?そうでない場合はどうすればよいですか?
答え1
kill -STOP $PID
[...]
kill -CONT $PID
@ジョーダン追加:like SIGKILL
(kill -9
同じ)とSIGSTOP
canを参照してください。いいえ無視される。
答え2
(重複または終了した質問にも答えてください。実行中のプロセスを一時停止または停止する方法は?、回復後にアプリがクラッシュした場合はどうすればよいか尋ねます。 )
kill -STOP $PID
&以降、一部のプロセスが正しく再開されませんkill -CONT $PID
。この場合、チェックポイント/復元を試すことができます。クリウ。オーバーヘッドが気に入らない場合は、仮想マシンでプロセスを実行して中断することもできます。
SIGSTOP
プロセスが後で再開できない理由の1つは、プロセスが停止して再開されたときにLinuxの特定のブロックシステムコールが失敗するためSIGCONT
です。 ~からEINTR
SIGCONT
信号(7):
停止信号によるシステムコールとライブラリ機能の中断
Linuxでは、シグナルハンドラがなくてもプロセスが停止信号の1つで停止した後に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