从脚本运行脱离脚本而不杀死容器

时间:2016-02-01 16:57:52

标签: bash emacs docker nohup

我有一个包含以下行的脚本:

fgrep -m 1 'PostgreSQL init process complete' <( docker run --name test-postgres-migration \
                                                            -a STDOUT -p 5432:5432 postgres:9.4 )

但是,即使我将其更改为:

fgrep -m 1 'PostgreSQL init process complete' <( docker run --name test-postgres-migration \
                                                            -a STDOUT -p 5432:5432 postgres:9.4 </dev/null )

或:

fgrep -m 1 'PostgreSQL init process complete' <( docker run --name test-postgres-migration \
                                                            -a STDOUT -p 5432:5432 postgres:9.4 </dev/null ) </dev/null

甚至当我将整行放在一个单独的shell脚本中并将其包装在nohup中时:

nohup ./boot-container.sh

如果脚本在以后的行中被杀死(通过emacs),则docker容器仍会死亡。发生这种情况是因为docker client命令仍在运行,即使它有PID 1作为其父级,出于某种神秘的原因(可能是由于共享的 stdin文件句柄 或tty )当脚本被杀死时它也会被杀死,这反过来导致它已经开始死亡的docker容器。我该如何防止这种情况?

1 个答案:

答案 0 :(得分:1)

在这种情况下,即使nohup也不够 - 有必要使用setsid

fgrep -m 1 'PostgreSQL init process complete' <( setsid docker run --name test-postgres-migration \
                                                                   -a STDOUT -p 5432:5432 postgres:9.4 )

这解决了我在Linux上遇到的问题 - 我还没有验证Mac或Unix上是否出现问题,或者Mac和其他Unix的this unofficial port of setsid是否修复了它。