autossh 的 Bash 初始化脚本

标签 bash ssh init

我正在尝试创建一个脚本,该脚本将在启动时通过 init 脚本启动 autossh,但我无法让它工作。我希望看到它记录所有的操作,因为它无法正常工作,但进展并不顺利。由于我不是 bash 专业人士,我希望我的代码不会非常令人尴尬。

#!/bin/sh
#
# by Patrick van der Leer <<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="4c3c2d38623a282029293e0c2b212d2520622f2321" rel="noreferrer noopener nofollow">[email protected]</a>>
# released under GPL, version 2 or later

PATH=/sbin:/bin:/usr/sbin:/usr/bin
DAEMON="/usr/bin/autossh"
DESC="Autossh job"
PIDFOLDER="/var/run/autossh"
PIDFOLDERSSH="$PIDFOLDER/ssh"
REMOTE_USER=""
REMOTE_ADDR=""
LOGFILE="/var/log/autossh.log"

if [ ! -d $PIDFOLDER ] ; then
    mkdir -p $PIDFOLDER
fi

if [ ! -d $PIDFOLDERSSH ] ; then
    mkdir -p $PIDFOLDERSSH
fi

test -f $DAEMON || exit 0

. /lib/lsb/init-functions

PIDFILE="$PIDFOLDER/$REMOTE_USER-$REMOTE_ADDR.pid"
PIDFILESSH="$PIDFOLDERSSH/$REMOTE_USER-$REMOTE_ADDR.pid"

is_running() {
    if [ -f $PIDFILE ]; then
        PID=`cat $PIDFILE`
        if [ -n "$PID" ]; then
            return 0
        else
            return 1
        fi
    else
        return 1
    fi
}

start_autossh() {
    if ! is_running; then
        echo "Starting $DESC"
        export AUTOSSH_FIRST_POLL=10
        export AUTOSSH_POLL=60
        export AUTOSSH_PIDFILE=$PIDFILESSH
        start-stop-daemon --start --make-pidfile --pidfile $PIDFILE --exec $DAEMON -- -M 29000 -i /root/.ssh/id_rsa -X -C -R 2222:localhost:22 $REMOTE_USER@$REMOTE_ADDR >> $LOGFILE 2>&1 &
        sleep 1;
        if ! is_running; then
            echo "$DESC: running @ pid $PID"
        else
            echo 'Something went wrong';
        fi
    else
        echo "$DESC: already running (pid $PID)"
    fi
}

stop_autossh() {
    if is_running; then
        echo "Stopping $DESC"
        start-stop-daemon --stop --pidfile $PIDFILE --signal 15
        if [ -f $PIDSSHFILE ]; then
            PIDSSH=`cat $PIDFILESSH`
            kill $PIDSSH
            rm -f $PIDFILESSH
        fi
    else
        echo "$DESC: not running"
    fi
    [ -f $PIDFILE ] && rm -f $PIDFILE
}

case "$1" in
    start)
        start_autossh
    ;;
    stop)
        stop_autossh
    ;;
    force-reload|restart)
        stop_autossh
        start_autossh
    ;;
    status)
        if is_running; then
            echo "$DESC: running (pid $PID)"
            exit 0
        else
            echo "$DESC: not running"
            [ -f $PIDFILE ] && exit 1 || exit 3
        fi
    ;;
    log)
        if [ -f $LOGIFLE ]; then
            tail $LOGFILE
        else
            echo "log file '$LOGFILE' does't exist"
        fi
    ;;
    *)
        echo "Usage: $0 {start|stop|restart|force-reload|status|log}"
        exit 3
    ;;
esac

exit 0

最佳答案

如果您设置了 x 选项,Shell 将在执行之前打印所有语句。要么:

  • /bin/sh -x script 方式运行脚本。
  • #! 行更改为 #!/bin/sh -x
  • 在脚本开头执行set -x

显然,第一个将为该一次运行设置它,另外两个将为每次运行设置它。


检查 start-stop-daemon(8) 的手册页看来你用错了。您不应该使用&后台start-stop-daemon,而应该告诉start-stop-daemon使用 --background 选项将执行的进程置于后台。 --make-pidfile 的文档甚至说除非与 --background 选项一起使用,否则不应期望它能够工作。

您还应该重定向 start-stop-dameon 的输出,它只是您需要重定向的进程的输出。 start-stop-daemon 会将其重定向到 /dev/null IIRC,但我没有找到覆盖它的方法。您可能必须创建一个包装器,它将通过适当的重定向来执行它,并在--startas选项中使用它,除非您设法告诉autossh直接登录到文件。

关于autossh 的 Bash 初始化脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9296686/

相关文章:

Jenkins worker : SSH or JNLP Connection?

SSH 到 Github 不工作

package - 如何在我自己的程序中打包Tcl库?

ckeditor - 第二次后无法在 CKeditor 中显示内容

Python 多继承,__init__

Bash 将多行字符串转换为单个换行符分隔的字符串

bash - 使用 EOF 时 SSH 返回值

bash - 如何最好地包含其他脚本?

bash - 为什么 extglob 除了打破 except 条件?

php - 通过 php/shell 脚本在 linux 中创建一个文件?