Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 正在等待在makefile中执行shell命令_Bash_Shell_Makefile - Fatal编程技术网

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的优点(你会很快地将自己绑在一起,试图让它工作)。啊,谢谢。当我看到这个问题时,我有一种感觉,某种东西闻起来像是比赛条件/异步计时。谢谢你深入了解这一点,我应该更仔细地阅读手册。啊,谢谢。当我看到这个问题时,我有一种感觉,某种东西闻起来像是比赛条件/异步计时。谢谢你深入了解这一点,我应该更仔细地阅读一下手册。