2014-02-26 49 views
1

我有這樣的/etc/init.d/unicorn-bash:CMD:命令未找到

#!/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 

我想開始我的本地文件夾的軌道麒麟。我覺得這個命令應該工作:

su - vagrant -c cmd 

並不能找出原因。

+1

你爲什麼導出'PATH'而沒有引用'$ PATH'?你爲什麼用'su'來運行命令?使用'sudo'。或者在腳本啓動時使用'sudo -s',以便成爲root用戶。或者更好的是,總是以root身份運行腳本。 –

+2

@AlexejMagura這是一個init腳本。它始終以root身份運行。他使用su是因爲他想要命令以非root用戶身份運行。 –

回答

1

我想你的印象是在該腳本中定義的shell函數cmd應該在早些啓動該腳本的shell中可用。

這是錯誤的,除非source d表示腳本(這在/etc/init.d/中是不常用的腳本)。當你啓動一個腳本(不是source它)時,你開始第二個執行腳本的進程。 shell函數的所有定義(如cmd)僅在該shell腳本中有效,並且與進程一起死亡。

如果你真的想cmd可用,你將不得不source腳本unicorn

source /etc/init.d/unicorn 

su命令,但是,仍然不能稱之爲外殼的功能,因爲它只可以調用可執行文件,它可以使用exec()開始,所以它們需要成爲一個文件。一個shell函數不是。

0

爲了解決這個問題,內聯函數由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.