我的团队使用 Pallet(想想 Clojure 中的 Puppet)来自动化服务器配置,但遇到了一个相当基本的问题:Pallet 可以直接在目标虚拟机上执行任意脚本,但如果其中一个脚本碰巧在后台放置了一个命令,那么它只是没有被执行。至少,不是以我们尝试设计事物的方式。
我们已经尝试使用 & 和 screen 进行此操作,后者是理想的选择,但两者都不起作用。例如,我们尝试让 Pallet 在目标虚拟机上执行以下脚本......
touch a
touch b &
touch c
我们远程看到的只是文件 a 和 c 存在。执行主脚本的 shell(或者我的意思是进程?)只是拒绝执行“touch b”。另一方面,如果我们在同一主机上使用普通终端会话执行此脚本,则它可以正常工作。
当然,我们是从 Pallet 的角度来解决这个问题的。但如果这没有结果,有人可以告诉我在什么情况下 shell 会拒绝执行后台进程,以防它为我们提供解决方法的线索吗?
我们正在使用 CentOS 6.5 64 位,但我认为这并不相关。
答案1
尝试:
touch b & disown
也许子进程会因为父进程退出而被信号杀死。用于help disown
查看 disown 的作用。
有单独的nohup
程序可以执行相同的操作,但这可以在任何 shell 下工作:
nohup touch b