我在/etc/init.d/unicorn 中有这个
#!/bin/bash
# /etc/init.d/unicorn
# ### BEGIN INIT INFO
# chkconfig: 2345 95 016
# processname: unicorn
# dscription: Stop/start unicorn
### END INIT INFO
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
cmd() {
cd /vagrant
unicorn -p 3000 -D
}
# Start the service
start() {
su - vagrant -c cmd
}
### main logic ###
case "$1" in
start)
start
;;
*)
echo $"Usage: $0 {start}"
exit 1
esac
exit 0
我正在尝试在我的本地 rails 文件夹中启动独角兽。我觉得这个命令应该有效:
su - vagrant -c cmd
并且无法找出原因。
我猜你的印象是,在该脚本中定义的 shell 函数cmd
应该在之前启动该脚本的 shell 中可用。
这是错误的,除非您source
该脚本(这对于/etc/init.d/
中的脚本来说是不寻常的)。 当您启动脚本(而不是source
它)时,您将启动执行该脚本的第二个进程。 所有 shell 函数的定义(如 cmd
)仅在该 shell 脚本中有效,并随进程一起死亡。
如果您确实希望cmd
可用,则必须unicorn
source
脚本:
source /etc/init.d/unicorn
但是,su
命令仍然无法调用该shell函数,因为它只能调用它可以开始使用exec()
的可执行文件,因此它们需要是一个文件。 外壳函数不是。
要解决此问题,请在 shell 中内联由 su
调用的函数:
start() {
su - vagrant -c 'cd /vagrant && unicorn -p 3000 -D'
}
至于首先找出原因,工具是有帮助的:
$ shellcheck unicorn
In unicorn line 19:
su - vagrant -c cmd
^-- SC2033: Shell functions can't be passed to external commands.