我有一个用于启动服务器的脚本,用于启动服务器,然后告诉它在 launchd 将其终止时正常退出(应该在关机时)。我的问题:告诉脚本空闲直到它收到信号的适当的惯用方式是什么?我应该只使用 while-true-sleep-1 循环,还是有更好的方法来做到这一点?
#!/bin/bash
cd "`dirname "$0"`"
trap "./serverctl stop" TERM
./serverctl start
# wait to receive TERM signal.
您可以简单地使用“无限睡眠”。如果您想在关机时执行更多操作并且不想为此创建函数,则替代方法可能是:
#!/bin/bash
sleep infinity & PID=$!
trap "kill $PID" INT TERM
echo starting
# commands to start your services go here
wait
# commands to shutdown your services go here
echo exited
“sleep infinity”的另一种替代方案(例如,busybox 似乎不支持它)可能是“tail -fn0 $0”。
即使在其中休眠, plainwait
也比自旋锁占用的资源要少得多。
为什么要保持脚本运行?有什么理由吗?如果您在发出信号后不做任何事情,那么我看不出有什么原因。
当您从关闭中获得 TERM 时,您的 serverctl 和服务器可执行文件(如果有)也同时获得 TERM。
要按设计执行此操作,您必须将 serverctl 脚本安装为 rc 脚本并让 init(启动和)停止它。在这里,我描述了如何设置最初不是作为服务器工作的服务器进程。