我正在 Emacs Lisp 中编写一些代码,我想在其中使用start-process
或类似函数启动子进程。但是,当父 emacs 进程退出时,我不希望子进程退出。但是,似乎退出父 emacs 进程也总是会杀死所有子进程。以下代码片段演示了这一点:
(require 'async)
(async-sandbox
(lambda ()
(require 'package)
(package-initialize)
(require 'async)
(shell-command "{ echo -n 'SPAWNING: '; date; } > ~/temp/ASYNC_LOG")
(start-process-shell-command "subproc" nil
"{ echo -n 'STARTED: '; date; } >> ~/temp/ASYNC_LOG;
sleep 5;
{ echo -n 'FINISHED: '; date; } >> ~/temp/ASYNC_LOG;")
(shell-command "{ echo -n 'SPAWNED: '; date; } >> ~/temp/ASYNC_LOG")
(shell-command "sleep 2")
(shell-command "{ echo -n 'FINISHED WAITING: '; date; } >> ~/temp/ASYNC_LOG")
))
此代码同步生成一个 emacs 进程(async-sandbox (lambda () ...)
,以便我们可以退出该进程以触发问题。然后该进程异步生成一个子进程(start-process-shell-command ...)
。父进程休眠2秒,子进程休眠5秒,所以父进程会先退出。当我运行这段代码时,我从未在日志文件中看到“FINISHED”行,这表明子进程在 2 秒后被杀死。如果我将父级更改为等待 7 秒,那么我会在输出中看到 FINISHED 行。
那么有没有类似的方法来启动一个子进程,这样它就不会在它的父进程退出时被杀死?