.net-core app:如何将SIGTERM发送到子进程?

时间:2016-12-08 14:23:01

标签: signals .net-core

在Linux上运行的.net-core应用程序是否可以向子进程发送SIGTERM信号?

我们正在考虑将我们的.net应用程序移植到.net-core并在Linux上运行它,以避免当前的信号实现(即从父进程发送OnFailure = "AddEditFailed(xhr, status, 'Person')",并使用pywin32包,以及{子进程中的{1}}

2 个答案:

答案 0 :(得分:1)

不幸的是,答案似乎为否。

我的研究:

可以通过调用Process.Kill停止进程。在Linux上,这是 通过发送SIGKILL信号来实现,该信号告诉内核 立即终止该应用程序。无法发送 SIGTERM信号,要求应用程序正常运行 终止。

来源:https://developers.redhat.com/blog/2019/10/29/the-net-process-class-on-linux/

此外,似乎已经对此进行了讨论,但已被丢弃为“不必要的”:

不再支持上面直接显示的现有专用API 通过@tmds并用于常规信号发送和处理 https://www.nuget.org/packages/Mono.Posix.NETStandard/

但是Mono.Posix.NETStandard似乎不允许发送信号以按进程ID处理:

Mono.Posix不允许您向进程发送信号 进程ID。因此,对于此目的,它几乎没有用。 问题。

来源:https://github.com/dotnet/corefx/issues/3188

如果有人对OP的问题有一个可行的解决方案,那么我也将有兴趣知道该怎么做。

答案 1 :(得分:1)

https://github.com/mono/mono/blob/master/mcs/class/Mono.Posix/Mono.Unix.Native/Syscall.cs中实施的启发,这是一个实用程序类,应根据您的需要进行操作

public static class ProcessUtils
{        
    [DllImport ("libc", SetLastError=true, EntryPoint="kill")]
    private static extern int sys_kill (int pid, int sig);
    
    public static void Kill(this Process process, Signum sig)
    {
        sys_kill(process.Id, (int) sig);
    }
}

public enum Signum : int {
    SIGHUP    =  1, // Hangup (POSIX).
    SIGINT    =  2, // Interrupt (ANSI).
    SIGQUIT   =  3, // Quit (POSIX).
    SIGILL    =  4, // Illegal instruction (ANSI).
    SIGTRAP   =  5, // Trace trap (POSIX).
    SIGABRT   =  6, // Abort (ANSI).
    SIGIOT    =  6, // IOT trap (4.2 BSD).
    SIGBUS    =  7, // BUS error (4.2 BSD).
    SIGFPE    =  8, // Floating-point exception (ANSI).
    SIGKILL   =  9, // Kill, unblockable (POSIX).
    SIGUSR1   = 10, // User-defined signal 1 (POSIX).
    SIGSEGV   = 11, // Segmentation violation (ANSI).
    SIGUSR2   = 12, // User-defined signal 2 (POSIX).
    SIGPIPE   = 13, // Broken pipe (POSIX).
    SIGALRM   = 14, // Alarm clock (POSIX).
    SIGTERM   = 15, // Termination (ANSI).
    SIGSTKFLT = 16, // Stack fault.
    SIGCLD    = SIGCHLD, // Same as SIGCHLD (System V).
    SIGCHLD   = 17, // Child status has changed (POSIX).
    SIGCONT   = 18, // Continue (POSIX).
    SIGSTOP   = 19, // Stop, unblockable (POSIX).
    SIGTSTP   = 20, // Keyboard stop (POSIX).
    SIGTTIN   = 21, // Background read from tty (POSIX).
    SIGTTOU   = 22, // Background write to tty (POSIX).
    SIGURG    = 23, // Urgent condition on socket (4.2 BSD).
    SIGXCPU   = 24, // CPU limit exceeded (4.2 BSD).
    SIGXFSZ   = 25, // File size limit exceeded (4.2 BSD).
    SIGVTALRM = 26, // Virtual alarm clock (4.2 BSD).
    SIGPROF   = 27, // Profiling alarm clock (4.2 BSD).
    SIGWINCH  = 28, // Window size change (4.3 BSD, Sun).
    SIGPOLL   = SIGIO, // Pollable event occurred (System V).
    SIGIO     = 29, // I/O now possible (4.2 BSD).
    SIGPWR    = 30, // Power failure restart (System V).
    SIGSYS    = 31, // Bad system call.
    SIGUNUSED = 31
}