我在/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
并无法弄清楚原因。
答案 0 :(得分:1)
我猜您的印象是,该脚本中定义的shell函数cmd
应该在早先启动该脚本的shell中可用。
这是错误的,除非你source
那个脚本(/etc/init.d/
中的脚本不常见)。当您启动脚本(而不是source
)时,您将启动执行脚本的第二个进程。 shell函数的所有定义(如cmd
)仅在该shell脚本中有效,并随着该过程而死亡。
如果您真的希望cmd
可用,则必须source
脚本unicorn
:
source /etc/init.d/unicorn
然而,su
命令仍然无法调用该shell函数,因为它只能调用可以使用exec()
开始的可执行文件,因此它们需要是一个文件。 shell函数不是。
答案 1 :(得分:0)
要解决此问题,请在su
调用的shell中内联函数:
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.