gpt4 book ai didi

bash - Bash的Autossh初始化脚本

转载 作者:行者123 更新时间:2023-12-02 13:58:59 25 4
gpt4 key购买 nike

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

#!/bin/sh
#
# by Patrick van der Leer <pat.vdleer@gmail.com>
# 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,但是我看不到一种替代此方法。除非您设法告诉exec直接登录文件,否则您可能必须创建一个包装器,用适当的重定向对其进行--startas编码,并在autossh选项中使用该包装器。

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

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com