如何在Haskell中获取已创建进程的进程ID?

sto*_*ont 6 haskell

也许我只是缺少System.Process API(http://hackage.haskell.org/package/process)中显而易见的东西,但它似乎不支持获取创建的进程的原始PID.API通常返回一个可以很容易使用的ProcessHandle,但这似乎不能满足我的部署需求.

我有一个案例,我想生成一个长时间运行的进程,记录它正在使用的PID,并能够在以后的某个时间(几天,几周,几个月)自动返回并杀死旧进程并重新启动新进程.我确信有几种方法可以执行此自动部署和重新启动,但PID似乎是最简单的方法,没有太多依赖于平台的代码.

我对其基本问题的其他建议持开放态度,但对我来说似乎很奇怪,我在流程API中找不到任何直接PID引用(或转换为它们的方法).这似乎是对API的疏忽.

Eri*_*ikR 4

这是一些示例代码:

import System.Process
import System.Process.Internals

-- | returns Just pid or Nothing if process has already exited
getPid ph = withProcessHandle ph go
  where
    go ph_ = case ph_ of
               OpenHandle x   -> return $ Just x
               ClosedHandle _ -> return Nothing

main = do
  (_,_,_,ph) <- createProcess $ shell "echo $$"
  getPid ph >>= print
Run Code Online (Sandbox Code Playgroud)

注意:我还没有在 Windows 下测试过它,但它可以在 OSX 和 Linux 上运行。

对于 Windows,Win32 包getProcessId在 module 中有一个函数System.Win32.Process,根据我读过的代码,这应该可以工作:

import System.Win32.Process (getProcessId)

main = do
    (_,_,_,ph) <- createProcess $ shell "echo $$"
    pid <- withProcessHandle ph go
    print pid

  where go (OpenHandle x)   = fmap Just $ getProcessId x 
        go (ClosedHandle _) = return Nothing
Run Code Online (Sandbox Code Playgroud)

我所基于的代码是(链接)的代码interruptProcessGroupOf