带有 screen 命令的 init.d 脚本不起作用

带有 screen 命令的 init.d 脚本不起作用

我写了这个简单的启动脚本:

SESSION_NAME="session1"
COMMAND="python /opt/aaa/manage.py runserver 192.168.1.1:4300"

case "$1" in
    start)
        screen -dmS "$SESSION_NAME" "$COMMAND" "$ARGUMENTS"
        echo "session1 started"
        ;;
    stop)
        echo "Stopping session1"
        screen -S session1 -X quit
        echo "."
        echo "session1 stopped"
        ;;
    restart)
        echo "Restarting session1"
        screen -S session1 -X quit
        echo "."
        screen -dmS "$SESSION_NAME" "$COMMAND" "$ARGUMENTS"
        echo "session1 has restarted"
        ;;
    *)
        echo "Usage: /etc/init.d/session1 {start|stop|restart}"
        exit 1
        ;;
esac
exit 0

但是如果我运行 /etc/init.d/startscript.sh start,它不起作用。屏幕会话不运行。你能帮助我吗?谢谢你的回复。

答案1

服务的问题在于用户和tty。

让屏幕在启动时运行的另一种方法是让用户自动登录,然后使用“~/.screenrc”中预配置的一组窗口和命令启动屏幕

登录时重新连接到该屏幕。

答案2

我看到您的屏幕无法启动的唯一原因是 python 命令中存在错误。要识别问题,脚本命令可能会对您有所帮助。它会将输出写入您可以读取的日志文件。

这是该脚本的改进版本,其中包含我通常在脚本中添加的信息:

#!/bin/sh
NAME=session1
SCRIPTNAME=/etc/init.d/$NAME
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
SESSION_NAME="session1"
COMMAND="python /opt/aaa/manage.py runserver 192.168.1.1:4300"
LOGPATH="/var/tmp/session1.log"

case "$1" in
    start)
        screen -dmS "$SESSION_NAME" script -a --flush -c "$COMMAND" $LOGPATH
        echo "session1 started"
        ;;
    stop)
        echo "Stopping session1"
        screen -S session1 -X quit
        echo "."
        echo "session1 stopped"
        ;;
    restart)
        echo "Restarting session1"
        screen -S session1 -X quit
        echo "."
        screen -dmS "$SESSION_NAME" script -a --flush -c "$COMMAND" $LOGPATH
        echo "session1 has restarted"
        ;;
    *)
        echo "Usage: $SCRIPTNAME {start|stop|restart}" >&2
        exit 2
        ;;
esac
exit 0

答案3

我认为问题出在你的$COMMAND变量上。命令名称应该是python可执行文件,其余的是参数。但是,如果你把它放在引号中,screen它会认为命令的名称是整个字符串并寻找具有该名称的可执行文件。

尝试这个:

COMMAND="/usr/bin/python /opt/aaa/manage.py runserver 192.168.1.1:4300"

case "$1" in
    start)
        screen -dmS "$SESSION_NAME" $COMMAND
        echo "$SESSION_NAME started"
        ;;
    ...

即,没有引号$COMMAND,也没有(不必要的)$ARGUMENTS变量。这应该可以工作。

答案4

最后我使用了这个脚本,但我删除了新窗口的命令 -如何在同一屏幕会话中自动启动新窗口?

相关内容