プロセスを終了せずに中断

プロセスを終了せずに中断

だから、バックグラウンドで実行される永続的なプログラムがあります。これを殺すと、別のPIDで再起動されます。一時停止したいです(実際に殺さずに省電力モードに設定)。 Kill-9はこれを行うことができますか?そうでない場合はどうすればよいですか?

答え1

kill -STOP $PID
[...]
kill -CONT $PID

@ジョーダン追加:like SIGKILLkill -9同じ)とSIGSTOPcanを参照してください。いいえ無視される。

答え2

(重複または終了した質問にも答えてください。実行中のプロセスを一時停止または停止する方法は?、回復後にアプリがクラッシュした場合はどうすればよいか尋ねます。 )

kill -STOP $PID&以降、一部のプロセスが正しく再開されませんkill -CONT $PID。この場合、チェックポイント/復元を試すことができます。クリウ。オーバーヘッドが気に入らない場合は、仮想マシンでプロセスを実行して中断することもできます。

SIGSTOPプロセスが後で再開できない理由の1つは、プロセスが停止して再開されたときにLinuxの特定のブロックシステムコールが失敗するためSIGCONTです。 ~からEINTRSIGCONT信号(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

答え3

あなたはそれを使用することができます削除STOP送るCONT PID を見つける必要がないように、プロセス名にシグナルを送信します。

名前でプロセスを一時停止します。

 pkill --signal STOP ProcessNameToSuspend

プロセスを起こすには:

 pkill --signal CONT ProcessNameToSuspend

標準システムでは、他のすべてのコマンド要素でTAB-completionを使用できます。ProcessName

関連情報