当前位置:   article > 正文

systemctl stop与信号

systemctl stop

systemctl stop与kill的关系

如果一个systemd的服务文件如下

/lib/systemd/system/sysdemo.service

[Unit]
Description=Demo Service
After=syslog.target network.target

[Service]
Restart=always
RestartSec=60
WorkingDirectory=/usr/bin
ExecStart=/usr/bin/sysdemo
ExecStop=/bin/kill $MAINPID

[Install]
WantedBy=default.target
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

那么使用下面这个命令就可以停止sysdemo.service

sudo systemctl stop sysdemo.service
  • 1

其实就是依据sysdemo.service文件定义,向/usr/bin/sysdemo运行起来的进程发送了kill -s SIGTERM信号(默认信号)

如果要使用core dump得这样,

LimitCORE=infinity
ExecStop=/bin/kill -s QUIT $MAINPID
  • 1
  • 2

程序响应kill信号

一般响应SIGINT与SIGTERM。

  • SIGINT 控制台执行ctrl+c 退出
  • SIGTERM 正常不带参数的kill命令信号
  • 如果需要core dump, 可以使用SIGQUIT
void sig_handler(int sig) {
    // SIGQUIT Ctrl+\,不同于SIGINT,这个是会产生core dump文件的。
    // 进程终止并且产生core文件
    if (sig == SIGINT) {
        // ctrl+c 退出时执行的代码
        std::cout << "ctrl+c pressed!" << std::endl;
        if (s_engine)
            s_engine->Stop();
    } else if (sig == SIGTERM) {
        // kill 退出时执行的代码
        std::cout << "got SIGTERM!" << std::endl;
        if (s_engine)
            s_engine->Stop();
    }
}

int main(int argc, char **argv) {

    struct sigaction sga;
    sigemptyset(&sga.sa_mask);
    sga.sa_flags = 0;
    sga.sa_handler = sig_handler;
    sigaction(SIGINT, &sga, NULL);
    sigaction(SIGTERM, &sga, NULL);
    ...
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

常见信号

查看man信号

$man 7 signal
  • 1

常见信号如下,未列举完全

       Signal     Value     Action   Comment
       ──────────────────────────────────────────────────────────────────────
       SIGHUP        1       Term    Hangup detected on controlling terminal
                                     or death of controlling process
       SIGINT        2       Term    Interrupt from keyboard
       SIGQUIT       3       Core    Quit from keyboard
       SIGILL        4       Core    Illegal Instruction
       SIGABRT       6       Core    Abort signal from abort(3)
       SIGFPE        8       Core    Floating-point exception
       SIGKILL       9       Term    Kill signal
       SIGSEGV      11       Core    Invalid memory reference
       SIGPIPE      13       Term    Broken pipe: write to pipe with no
                                     readers; see pipe(7)
       SIGALRM      14       Term    Timer signal from alarm(2)
       SIGTERM      15       Term    Termination signal
       SIGUSR1   30,10,16    Term    User-defined signal 1
       SIGUSR2   31,12,17    Term    User-defined signal 2
       SIGCHLD   20,17,18    Ign     Child stopped or terminated
       SIGCONT   19,18,25    Cont    Continue if stopped
       SIGSTOP   17,19,23    Stop    Stop process
       SIGTSTP   18,20,24    Stop    Stop typed at terminal
       SIGTTIN   21,21,26    Stop    Terminal input for background process
       SIGTTOU   22,22,27    Stop    Terminal output for background process


  The entries in the "Action" column of the tables below specify the default disposition for each signal, as follows:

       Term   Default action is to terminate the process.

       Ign    Default action is to ignore the signal.

       Core   Default action is to terminate the process and dump core (see core(5)).

       Stop   Default action is to stop the process.

       Cont   Default action is to continue the process if it is currently stopped.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

关于action一列,指明了该信号的动作。Term是终止进程,Core终止进程并产生core dump

常用几种信号区别

  • SIGKILL:
    The signals SIGKILL and SIGSTOP cannot be caught, blocked, or ignored.
    SIGKILL是发送到处理的信号以使其立即终止。当发送到程序,SIGKILL使其立即终止。在对比SIGTERM和SIGINT,这个信号不能被捕获或忽略,并且在接收过程中不能执行任何清理在接收到该信号。
    这也是kill -9 强制杀死进程的原因。

  • SIGQUIT:
    SIGQUIT是其控制终端发送到进程,当用户请求的过程中执行核心转储的信号。 SIGQUIT通常可以ctrl+ \。在Linux上,人们还可以使用Ctrl-4或虚拟控制台,SysRq yek。

  • SIGTERM:
    SIGTERM是kill或killall命令发送到进程默认的信号。它会导致进程的终止,但是SIGKILL信号不同,它可以被捕获和解释(或忽略)的过程。因此,SIGTERM类似于问一个进程终止可好,让清理文件和关闭。

  • SIGINT:
    当用户希望中断该进程发送处理的信号。通常ctrl-C,但在某些系统上,“删除”字符或“break”键

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/945192
推荐阅读
相关标签
  

闽ICP备14008679号