【问题标题】:Function in shell script not executed correctlyshell 脚本中的函数未正确执行
【发布时间】:2016-05-19 15:49:17
【问题描述】:

我编写了一个脚本来启动/停止/重新启动自定义服务器应用程序。

在启动守护服务器时,它应该进行以下操作:

#!/bin/sh -e
### BEGIN INIT INFO
...
...
### END INIT INFO

# Start service
pga_server_start()
{
        /opt/pga/server/server -d
}


# Stop  service
pga_server_stop()
{
        PID=`cat /var/lock/pga_server.lock`
        /bin/kill --signal SIGTERM $PID
}

pga_load_excalibur()
{
        is_loaded=`lsmod | grep excalbr`
        echo "Done"


        if [ -z "$is_loaded" ]; then
                /usr/local/bin/excload
                echo "Driver excalibur loaded."
        else
                echo "Driver excalibur already loaded."
        fi
}

case "$1" in
        start)
        pga_load_excalibur
        pga_server_start
        ;;
...
...

最初它运行良好。然后我添加了pga_load_excalibur 函数。 之后,它不再起作用了。 它永远不会从函数pga_load_excalibur 返回。 似乎对is_loaded=lsmod | 的调用grep excalbrnever returns as the subsequentecho` 永远不会被打印出来。

但是,如果我将此函数复制/粘贴到单独的 shell 脚本中...它可以工作。

但如果我以这种方式手动启动启动脚本:

/etc/init.d/服务器启动 或者 服务服务器启动

它不起作用。 我使用的是 Debian Wheezy 7.9 x64。

虽然我不是 schell 脚本,但它看起来是正确的。我不明白为什么当它嵌入到这个服务启动脚本中时它不起作用。

请注意,我也尝试将 grep 行替换为:

is_loaded=$(lsmod | grep excalbr)

但它也不起作用。 我的想法不多了:(

Z.

【问题讨论】:

    标签: linux bash shell debian


    【解决方案1】:

    如果在调试模式下运行脚本会得到什么?尝试运行它:

    #!/bin/sh -xv

    这可能会说明它失败的原因,如果您无法弄清楚,请发布输出

    【讨论】:

    • 好主意!我没想到。我明天早上试试,然后告诉你。
    • 嗯...我用你的代码头改了:#!/bin/sh -xv 一切正常。所以似乎使用 #!bin/sh -e 不是好的解决方案。 -e 表示如果命令失败,脚本立即退出。我仍然不明白命令有什么问题: is_loaded=lsmod | grep excalbr 最后,我删除了 -xv 并简单地将 #!/bin/sh 放在标题中。我不是 100% 满意,但至少脚本有效。
    • 从 -xv 发送调试信息,我会尽力提供帮助
    最近更新 更多