동기화 데몬은 스크립트를 사용하여 수동으로 시작되지만 부팅 시에는 시작되지 않습니다.

동기화 데몬은 스크립트를 사용하여 수동으로 시작되지만 부팅 시에는 시작되지 않습니다.

Linux Mint Debian 시스템에 동기화를 설치하고 /etc/init.d.이 튜토리얼. 심볼릭 링크가 /etc/rc.*존재하며 스크립트를 수동으로(루트로) 실행하면 데몬을 정상적으로 시작하고 중지할 수 있습니다. 그러나 부팅 시 스크립트가 시작되지 않습니다.

스크립트는 다음과 같습니다.

#!/bin/sh
### BEGIN INIT INFO
# Provides: syncthing
# Required-Start: $local_fs $remote_fs
# Required-Stop: $local_fs $remote_fs
# Should-Start: $network
# Should-Stop: $network
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Multi-user daemonized version of syncthing.
# Description: Starts the syncthing daemon for all registered users.
### END INIT INFO

# Replace with users you want to run syncthing clients for
syncthing_USERS="XXXXXX"
DAEMON=/opt/syncthing-linux-amd64-v0.10.8/syncthing

echo "This is /etc/init.d/syncthing" > /tmp/syncthing.txt

startd() {
  echo "Trying to start daemons..." >> /tmp/syncthing.txt
  for stuser in $syncthing_USERS; do
    echo "Trying $stuser"  >> /tmp/syncthing.txt
    HOMEDIR=$(getent passwd $stuser | awk -F: '{print $6}')
    echo "HOMEDIR = $HOMEDIR"  >> /tmp/syncthing.txt
    echo "config = $config"  >> /tmp/syncthing.txt
    if [ -f $config ]; then
      echo "Starting syncthiing for $stuser"
      start-stop-daemon -b -o -c $stuser -S -u $stuser -x $DAEMON
    else
      echo "Couldn't start syncthing for $stuser (no $config found)"
    fi
  done
}

stopd() {
  for stuser in $syncthing_USERS; do
    dbpid=$(pgrep -fu $stuser $DAEMON)
    if [ ! -z "$dbpid" ]; then
      echo "Stopping syncthing for $stuser"
      start-stop-daemon -o -c $stuser -K -u $stuser -x $DAEMON
    fi
  done
}

status() {
  for stuser in $syncthing_USERS; do
    dbpid=$(pgrep -fu $stuser $DAEMON)
    if [ -z "$dbpid" ]; then
      echo "syncthing for USER $stuser: not running."
    else
      echo "syncthing for USER $stuser: running (pid $dbpid)"
    fi
  done
}

case "$1" in
  start) startd
    ;;
  stop) stopd
    ;;
  restart|reload|force-reload) stopd && startd
    ;;
  status) status
    ;;
  *) echo "Usage: /etc/init.d/syncthing {start|stop|reload|force-reload|restart|status}"
     exit 1
   ;;
esac

exit 0

다음은 심볼릭 링크입니다:

$find /etc/rc* -name "*syncthing*"
/etc/rc0.d/K01syncthing
/etc/rc1.d/K01syncthing
/etc/rc2.d/S01syncthing
/etc/rc3.d/S01syncthing
/etc/rc4.d/S01syncthing
/etc/rc5.d/S01syncthing
/etc/rc6.d/K01syncthing

내 현재 런레벨은

$/sbin/runlevel
N 2

디버깅 목적으로 /tmp의 파일로 파이프되는 몇 가지 echo 문을 맨 위에 삽입했습니다. 놀랍게도 부팅 시 스크립트가 실행되지만 데몬이 시작되지 않고 파일을 읽습니다.

This is /etc/init.d/syncthing
Trying to start daemons...
Trying XXXXXX
HOMEDIR = /home/XXXXXX
config = 

루트로 스크립트를 실행하여 시작한 후 수동으로 시작하면 출력도 생성되며 출력은 동일합니다. 무슨 일이에요?

내가 이해하지 못하는 또 다른 점은 스크립트가 $config 파일을 테스트하지만 해당 변수가 정의되지 않아 파일이 존재하지 않는다는 것입니다. 그런데 이 테스트가 때로는 참으로 평가되기도 하고, 때로는 거짓으로 평가되는 것 같죠?

내가 무엇을 놓치고 있나요?

답변1

알았어, 확실해. 내 homedir은 ecryptfs를 사용하여 암호화되었으며 로그인할 때만 해독됩니다. 따라서 시작하는 동안 바이너리는 제대로 부팅해야 하는 ~/.config/syncthing/* 에 액세스할 수 없습니다. 물론 스크립트를 수동으로 시작하면 로그인되어 있으므로 모든 것이 잘 작동합니다.

바보 같은 나.

덧붙여서, start-stop-daemon에 대한 --no-close 옵션은 힌트를 제공하고 데몬의 출력을 파일로 파이프할 수 있도록 합니다. 어쨌든, 귀하의 의견에 진심으로 감사드립니다!

엔노

관련 정보