Bash 正在等待在makefile中执行shell命令
我一直在努力学习如何使用Bash 正在等待在makefile中执行shell命令,bash,shell,makefile,Bash,Shell,Makefile,我一直在努力学习如何使用make,遇到了一个我认为与流程管理有关的障碍,而不是make 我有以下目标 install: ... @brew install postgres @pg_ctl -D data initdb @pg_ctl -D data start @createuser foo -s 我正在安装postgres,创建一个数据库,启动它,然后创建一个用户 在这种情况下,createuser继续失败,因为数据库尚未启动 我假设需要做的是使用w
make
,遇到了一个我认为与流程管理有关的障碍,而不是make
我有以下目标
install:
...
@brew install postgres
@pg_ctl -D data initdb
@pg_ctl -D data start
@createuser foo -s
我正在安装postgres,创建一个数据库,启动它,然后创建一个用户
在这种情况下,createuser
继续失败,因为数据库尚未启动
我假设需要做的是使用wait
延迟createuser命令,直到数据库启动,但是经过一个小时的争论,我感觉我没有正确地使用wait,比如
@pg_ctl -D data start &
@wait $!
@createuser ...
知道我遗漏了什么吗?将
-w
选项添加到您的pg\u-ctl。。。启动
命令以确保在数据库完成启动之前,该命令不会返回:
@pg_ctl -w -D data start
从(我的)重点:
-w
等待启动或关闭完成等待是关机的默认选项,但不是启动。等待启动时,pg_ctl反复尝试连接到服务器。等待关机时,pg_ctl等待服务器删除其PID文件。pg_ctl根据启动或关闭成功返回退出代码
至于您的解决方案尝试: 正如在对该问题的评论中所指出的那样,
@pg\u ctl-D data start
和@pg\u ctl-D data start&
后跟@wait$代码>相当于:(有效地)同步执行CLI
问题在于,虽然CLI本身(pg_ctl
)的执行是同步的,但它触发的操作不是同步的;添加-w
修复了这一问题
事后看来,您的问题与make
无关,请将-w
选项添加到您的pg\u ctl。。。启动
命令以确保在数据库完成启动之前,该命令不会返回:
@pg_ctl -w -D data start
从(我的)重点:
-w
等待启动或关闭完成等待是关机的默认选项,但不是启动。等待启动时,pg_ctl反复尝试连接到服务器。等待关机时,pg_ctl等待服务器删除其PID文件。pg_ctl根据启动或关闭成功返回退出代码
至于您的解决方案尝试:
正如在对该问题的评论中所指出的那样,@pg\u ctl-D data start
和@pg\u ctl-D data start&
后跟@wait$代码>相当于:(有效地)同步执行CLI
问题在于,虽然CLI本身(pg_ctl
)的执行是同步的,但它触发的操作不是同步的;添加-w
修复了这一问题
事后看来,您的问题与没有帮助的make
无关-在后台运行,然后等待进程完成与在前台运行是一样的。问题是(可能是)pg_ctl
进程在DB服务器实际准备好接收请求之前返回。我认为问题是@pg_ctl-D data start
返回的退出代码表示数据库已启动,但数据库继续在后台启动。我以前在DB2中遇到过这个问题。在这种情况下,您需要等待一定的秒数,然后重试,如果失败,则再等待几秒,然后重试,依此类推,直到您确定时间过长。此时,Make绝对不是正确的选择…@OliverCharlesworth从获取退出代码然后让DB继续启动的意义上讲,这不是正确的选择?我想我是在胡乱摆弄睡眠和不断变化的时间间隔后,遇到了一个非特定的启动时间,但仍然会出错在这个用例中,我应该查看哪些资源来进一步了解make(与使用脚本相比)的优缺点?@sjhcockrell-基本上,过程/控制流代码不是make的强项(你会很快陷入困境,试图让它发挥作用)。这不会有任何帮助-在后台运行,然后等待进程完成与在前台运行是一样的。问题是(可能是)pg_ctl
进程在DB服务器实际准备好接收请求之前返回。我认为问题是@pg_ctl-D data start
返回的退出代码表示数据库已启动,但数据库继续在后台启动。我以前在DB2中遇到过这个问题。在这种情况下,您需要等待一定的秒数,然后重试,如果失败,则再等待几秒,然后重试,依此类推,直到您确定时间过长。此时,Make绝对不是正确的选择…@OliverCharlesworth从获取退出代码然后让DB继续启动的意义上讲,这不是正确的选择?我想我是在胡乱摆弄睡眠和不断变化的时间间隔后,遇到了一个非特定的启动时间,但仍然会出错在这个用例中,我应该查看哪些资源来了解make(与使用脚本相比)的优点/缺点?@sjhcockrell-基本上,过程/控制流代码不是make的优点(你会很快地将自己绑在一起,试图让它工作)。啊,谢谢。当我看到这个问题时,我有一种感觉,某种东西闻起来像是比赛条件/异步计时。谢谢你深入了解这一点,我应该更仔细地阅读手册。啊,谢谢。当我看到这个问题时,我有一种感觉,某种东西闻起来像是比赛条件/异步计时。谢谢你深入了解这一点,我应该更仔细地阅读一下手册。