也许我只是缺少System.Process API(http://hackage.haskell.org/package/process)中显而易见的东西,但它似乎不支持获取创建的进程的原始PID.API通常返回一个可以很容易使用的ProcessHandle,但这似乎不能满足我的部署需求.
我有一个案例,我想生成一个长时间运行的进程,记录它正在使用的PID,并能够在以后的某个时间(几天,几周,几个月)自动返回并杀死旧进程并重新启动新进程.我确信有几种方法可以执行此自动部署和重新启动,但PID似乎是最简单的方法,没有太多依赖于平台的代码.
我对其基本问题的其他建议持开放态度,但对我来说似乎很奇怪,我在流程API中找不到任何直接PID引用(或转换为它们的方法).这似乎是对API的疏忽.
这是一些示例代码:
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
| 归档时间: |
|
| 查看次数: |
839 次 |
| 最近记录: |