我有一个包含以下行的脚本:
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容器。我该如何防止这种情况?
答案 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是否修复了它。