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