精华内容
下载资源
问答
  • 易语言自动关闭子进程源码,自动关闭子进程,CreateJobObject,SetInformationJobObject,AssignProcessToJobObject,GetCurrentProcess,CloseHandle
  • 易语言源码易语言自动关闭子进程源码.rar 易语言源码易语言自动关闭子进程源码.rar 易语言源码易语言自动关闭子进程源码.rar 易语言源码易语言自动关闭子进程源码.rar 易语言源码易语言自动关闭子进程源码.rar ...
  • 作为@tony suggested,您可以在使用multiprocessing模块创建的子进程上设置daemon=True标志。要在python2.4上安装它,请键入:pip install multiprocessing。在如果主进程被信号终止,则子进程不会终止,因此需要...

    作为@tony suggested,您可以在使用multiprocessing模块创建的子进程上设置daemon=True标志。要在python2.4上安装它,请键入:pip install multiprocessing。在

    如果主进程被信号终止,则子进程不会终止,因此需要提供适当的信号处理程序:#!/usr/bin/env python

    import logging, signal, sys, time

    import multiprocessing as mp # `pip install multiprocessing` on Python <2.6

    class AddProcessNameFilter(logging.Filter):

    """Add missing on Python 2.4 `record.processName` attribute."""

    def filter(self, r):

    r.processName = getattr(r, 'processName', mp.current_process().name)

    return logging.Filter.filter(self, r)

    def print_dot():

    while True:

    mp.get_logger().info(".")

    time.sleep(1)

    def main():

    logger = mp.log_to_stderr()

    logger.setLevel(logging.INFO)

    logger.addFilter(AddProcessNameFilter()) # fix logging records

    # catch TERM signal to allow finalizers to run and reap daemonic children

    signal.signal(signal.SIGTERM, lambda *args: sys.exit(-signal.SIGTERM))

    # create daemonic child processes

    processes = [mp.Process(target=print_dot) for _ in range(2)]

    for p in processes:

    p.daemon = True

    p.start()

    print_dot()

    if __name__=="__main__":

    mp.freeze_support()

    main()

    展开全文
  • 有时我们会遇到这样的需求,在一个主进程中启动另外一个进程,而在 Go 中可以使用 exec 包的 Cmd 来轻松实现这类需求,例如代码:package mainimport ("fmt""log""os""os/exec""os/signal")func main() {cmd := exec...

    有时我们会遇到这样的需求,在一个主进程中启动另外一个进程,而在 Go 中可以使用 exec 包的 Cmd 来轻松实现这类需求,例如代码:

    package main

    import (

    "fmt"

    "log"

    "os"

    "os/exec"

    "os/signal"

    )

    func main() {

    cmd := exec.Cmd{

    Path: "nc",

    Args: []string{"-u", "-l", "8888"},

    Dir: "/usr/bin",

    }

    if err := cmd.Start(); err != nil {

    log.Panic(err)

    }

    fmt.Println("Start child process with pid", cmd.Process.Pid)

    c := make(chan os.Signal, 1)

    signal.Notify(c, os.Interrupt)

    s :=

    fmt.Println("Got signal:", s)

    }

    这段代码的含义是: 使用 nc -u -l 8888 来模拟一个常驻进程,然后通过 Go 的 exec.Cmd 来运行它,并且 Go 代码不退出,运行代码:

    $ go run main.go

    Start child process with pid 35904

    输出结果表明我们已经通过 Go 成功调用外部命令,起了一个子进程,其进程号为 35904,我们还可以通过命令 ps -ef 35904 来确认:

    UID PID PPID C STIME TTY TIME CMD

    2062309935 35904 35903 0 3:36PM ttys008 0:00.00 -u -l 8888

    如何结束子进程

    首先想到的就是 kill 命令,尝试使用 kill 35904

    $ kill 35904

    $ ps -ef 35904

    UID PID PPID C STIME TTY TIME CMD

    2062309935 35904 35903 0 3:36PM ttys008 0:00.00 (nc)

    发现 kill 命令并不好用,进程还在,然后换成 kill -9 也同样不起作用。不过该进程已经停止运行了,可以看到监听由 0:00.00 -u -l 8888 变成了 0:00.00 (nc), 不再监听 8888 端口,只是进程资源还没释放而已。

    使用 Go 代码结束该进程

    因为 Go 的 Cmd 内置了 Process.Kill() 函数,我们可以尝试使用它来关闭子进程,修改代码,添加如下内容:

    // After five second, kill cmd's process

    time.Sleep(5 * time.Second)

    cmd.Process.Kill()

    重新运行代码,发现 5 秒过后,该子进程还在。其实调用 cmd.Process.Kill() 和外部使用 kill 命令是一样的,父进程还没有释放资源,所以子进程不能清理完成。

    使用 cmd.Wait() 完成资源清理,修改后的完整代码如下:

    package main

    import (

    "fmt"

    "log"

    "os"

    "os/exec"

    "os/signal"

    "time"

    )

    func main() {

    cmd := exec.Cmd{

    Path: "nc",

    Args: []string{"-u", "-l", "8888"},

    Dir: "/usr/bin",

    }

    if err := cmd.Start(); err != nil {

    log.Panic(err)

    }

    fmt.Println("Start child process with pid", cmd.Process.Pid)

    // Wait releases any resources associated with the Cmd

    go func() {

    if err := cmd.Wait(); err != nil {

    fmt.Printf("Child process %d exit with err: %v\n", cmd.Process.Pid, err)

    }

    }()

    // After five second, kill cmd's process

    time.Sleep(5 * time.Second)

    cmd.Process.Kill()

    c := make(chan os.Signal, 1)

    signal.Notify(c, os.Interrupt)

    s :=

    fmt.Println("Got signal:", s)

    }

    运行代码,可以得到如下结果:

    $ go run main.go

    Start child process with pid 41666

    Child process 41666 exit with err: signal: killed

    再通过 ps -el 41666 命令确认子进程 41666 已不存在。

    结语

    Go 中 exec.Cmd 封装的很好,对于外部命令调用非常方便,但是使用它的时候,需要注意对子进程的资源进行释放,其关键函数就是 cmd.Wait(), 所以用到 cmd 的地方,一定添加 cmd.Wait() 的逻辑。

    参考链接:

    golang 微信交流群请+微信17812796384

    展开全文
  • I have have a main process that forks a number of subprocesses. I want to be able to kill these child processes off when my main process gets the kill signal. Ideally I would want to do something alon...

    I have have a main process that forks a number of subprocesses. I want to be able to kill these child processes off when my main process gets the kill signal. Ideally I would want to do something along the lines of:

    def handler(signum, frame, pid_list):

    log('Killing Process')

    for pid in pid_list:

    os.kill(pid, signal.SIGTERM)

    os.waitpid(pid, 0) # need

    sys.exit()

    if __name__ == "__main__":

    signal.signal(signal.SIGTERM, handler(pid_list))

    But of course, that doesn't work... any suggestions?

    解决方案

    As @tony suggested you could set daemon=True flag on a child process created using multiprocessing module. To install it on python2.4, type: pip install multiprocessing.

    The child processes won't be terminated if the main process is killed by a signal so you need to provide an appropriate signal handler:

    #!/usr/bin/env python

    import logging, signal, sys, time

    import multiprocessing as mp # `pip install multiprocessing` on Python <2.6

    class AddProcessNameFilter(logging.Filter):

    """Add missing on Python 2.4 `record.processName` attribute."""

    def filter(self, r):

    r.processName = getattr(r, 'processName', mp.current_process().name)

    return logging.Filter.filter(self, r)

    def print_dot():

    while True:

    mp.get_logger().info(".")

    time.sleep(1)

    def main():

    logger = mp.log_to_stderr()

    logger.setLevel(logging.INFO)

    logger.addFilter(AddProcessNameFilter()) # fix logging records

    # catch TERM signal to allow finalizers to run and reap daemonic children

    signal.signal(signal.SIGTERM, lambda *args: sys.exit(-signal.SIGTERM))

    # create daemonic child processes

    processes = [mp.Process(target=print_dot) for _ in range(2)]

    for p in processes:

    p.daemon = True

    p.start()

    print_dot()

    if __name__=="__main__":

    mp.freeze_support()

    main()

    展开全文
  • 我需要在python中使用多进程,可是我发现不论是multiprocessing.pool.Pool还是concurrent.futures.ProcessPoolExecutor都没有提供对子进程的终止?我现在急需要这样的功能,该如何实现?我有看ProcessPoolExecutor的...

    我需要在python中使用多进程,可是我发现不论是multiprocessing.pool.Pool还是concurrent.futures.ProcessPoolExecutor都没有提供对子进程的终止?我现在急需要这样的功能,该如何实现?

    我有看ProcessPoolExecutor的源代码,ProcessPoolExecutor大概就是在submit后会把参数视为一个work_item,添加到call_queue中去,再由_process_worker取出call_item并运行,感觉也没法用hack的手段来实现终止啊。。

    下面是ProcessPoolExecutor中的部分核心源代码。。

    def _process_worker(call_queue, result_queue):

    """Evaluates calls from call_queue and places the results in result_queue.

    This worker is run in a separate process.

    Args:

    call_queue: A multiprocessing.Queue of _CallItems that will be read and

    evaluated by the worker.

    result_queue: A multiprocessing.Queue of _ResultItems that will written

    to by the worker.

    shutdown: A multiprocessing.Event that will be set as a signal to the

    worker that it should exit when call_queue is empty.

    """

    while True:

    call_item = call_queue.get(block=True)

    if call_item is None:

    # Wake up queue management thread

    result_queue.put(os.getpid())

    return

    try:

    r = call_item.fn(*call_item.args, **call_item.kwargs)

    except BaseException as e:

    exc = _ExceptionWithTraceback(e, e.__traceback__)

    result_queue.put(_ResultItem(call_item.work_id, exception=exc))

    else:

    result_queue.put(_ResultItem(call_item.work_id,

    result=r))

    展开全文
  • 阅读有关此主题的几个问题后,我现在知道子进程从父进程继承了...现在,当子进程完成,出现故障或其他任何情况时,所有操作都将停止并关闭连接.此时,子进程显示为已失效.然后,我希望父进程的连接在阻塞的recv调用上抛出E...
  • python win subprocess模块popen 如何开启关闭新控制台/使用管道及关闭子进程(ffmpeg相关) 结论 使用python的subprocess模块(windows环境下) 如何调用ffmpeg并作为守护进程(支持ffmpeg命令中使用管道...
  • 用scrapy做爬虫的时候需要开多个爬虫子进程,为了定时开启和关闭爬虫子进程,需要对子进程做控制,而关闭进程有两种方法-----要简单高效,直接看方法2吧-----方法1:通过获取全部windows进程,获取增量进程方式该...
  • class subprocess.Popen(args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=False, shell=False, cwd=None, env=None, universal_...等待子进程退出
  • 小编典典使用Java JNA可以找到一种更精简的方法。这绝对适用于Windows和Linux,我认为...假设您已获得进程的pid,则始终可以在linux中启动kill -9命令,或使用类似的方法在Windows中终止进程。这是一种本地获取linu...
  • 如何关闭子进程

    千次阅读 2013-05-21 22:09:26
    当退出C#程序时,我在程序中结束杀掉了那个批处理文件的Process,但是,那个批处理所调用的子进程却无法像直接调用批处理文件那样随着批处理文件的进程一起被杀掉,而是自动向上提升成为了独立的进程。 在网上查了...
  • 据我所知,在exec之前关闭文件描述符只能防止它们被复制(不需要从子进程向父进程发送信息) . 为什么这会影响子进程?通过设置标志 FD_CLOEXEC 来替换 close() 不会改变任何内容 . 在fork之前设置 FD_CLOEXEC 标志也...
  • 有时我们会遇到这样的需求,在一个主进程中启动另外一个进程,而在 Go 中可以使用 exec 包的 Cmd 来轻松实现这类需求,例如代码:package mainimport ("fmt""log""os""os/exec""os/signal")func main() {cmd := exec...
  • 如何在 Go 中优雅关闭子进程

    千次阅读 2019-06-19 18:01:20
    有时我们会遇到这样的需求,在一个主进程中启动另外一个进程,而在 Go 中可以使用 exec 包的 Cmd 来轻松实现这类需求,例如代码: package main import ( "fmt" "log" "os" "os/exec" "os/signal" ) func ...
  • win7 系统 ,,我有个服务程序,,启动后定时创建子进程在session1/2/...中,子进程中创建的互斥对象, 通过任务管理器吧子进程干掉后,,子进程中创建的互斥对象依然存在,如果干掉服务程序(父进程),子进程中创建...
  • 有时我们会遇到这样的需求,在一个主进程中启动另外一个进程,而在 Go 中可以使用 exec 包的 Cmd 来轻松实现这类需求,例如代码:package main import ( "fmt" "log" "os" "os/exec" "os/signal" ) func main...
  • 一、kill() kill(pid3,SIGKILL);...如果管理员发现某个进程终止不了,可尝试发送这个信号。 #include <stdio.h> #include <unistd.h> #include <sys/types.h> #include &...
  • 使用FD_CLOEXEC实现close-on-exec,关闭子进程无用文件描述符 分类: Linux/Unix 开发2011-12-09 10:23 7370人阅读 评论(3) 收藏 举报 socketlinux 我们经常会碰到需要fork子进程的情况,而且...
  • 在主进程中开了一个子进程,用于网络连接。当主界面退出时,貌似子进程还在跑。 请问怎么捕捉父进程的退出事件(关闭主界面),来关闭子进程
  • 我们经常会碰到需要fork子进程的情况,而且子进程很可能会继续exec新的程序。这就不得不提到子进程中无用文件描述符的问题! fork函数的使用本不是这里讨论的话题,但必须提一下的是:子进程以写时复制...
  • 在Process A中 Process.Start 一个Process B 问题:如何在Process B 中 结束 Process A? 谢谢。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,243
精华内容 897
关键字:

关闭子进程