如果我需要按顺序执行外部命令,那么最佳解决方案是什么?
例如,我有两个命令"制作快照"和"备份快照" 第二个在第一个完成之前无法启动。 如果我按顺序将这两个命令粘贴在do语法中,它们会一个接一个地执行,还是我必须手动检查并确保第一个完成?
对于手动完成检查,是否足以使用" system"或rawSystem"并检查他们的退出代码?
我不完全理解"系统"之间的区别。和" runCommand"功能。有人可以向我澄清这一点。我只能看到它们返回不同的值:退出代码与进程句柄。还有其他差异吗?
我宁愿使用" runCommand"为了上面的序列工作?我是否需要在进程句柄上调用wait?
感谢。
答案 0 :(得分:11)
我知道您正在使用System.Process模块来运行外部命令。这很好。
该模块包含阻塞和非阻塞IO操作。非阻塞的(如createProcess
,runCommand
)创建一个进程并立即返回其句柄,同时它仍在运行。阻塞的(如readProcess
,system
)不会返回任何句柄,而是在终止后返回运行流程的结果。
要确保进程已终止,您需要使用阻止操作,或使用waitForProcess
,这将阻塞,直到具有给定句柄的进程终止。
是否足以使用“system”或rawSystem“并检查他们的退出代码?
是
“system”和“runCommand”函数之间的区别
主要区别在于system
正在阻止而runCommand
未阻止。
我是否宁愿使用“runCommand”来完成上述序列?
不,在你的情况下,阻止通话就足够了。
我是否需要在进程句柄上调用wait?
仅当您决定使用非阻止呼叫时。
使用示例:
import System.Process
main = do
ExitSuccess <- system "make snapshot"
ExitSuccess <- system "backup snapshot"
return ()