脚本只在/etc/init.d之外执行

您好,非常感谢我在这里find了多年的帮助!

我有以下问题…我正在运行/etc/init.d/rsync在Ubuntu 16.04上启动RSYNCD服务器。 脚本执行,但没有parameter passing给rsync,所以它显示如下:

21138? Ss 0:00 / usr / bin / rsync –daemon –no-detach

如果我将/etc/init.d/rsync脚本复制到另一个位置(比如/ home / backup)并启动“/ home / backup / rsync start”,则该进程正确启动并显示:

21821? SN 0:00 / usr / bin / rsync –no-detach –daemon –config /etc/rsyncd.conf –address = 10.1.1.2

我以root身份运行(/etc/init.d/rsync和/ home / backup / rsync)。

真奇怪,我不明白为什么这个脚本行为在不同的地方是不一样的。

/etc/init.d/rsync和/ etc / default / rsync的内容如下:


/etc/init.d/rsync #! /bin/sh ### BEGIN INIT INFO # Provides: rsyncd # Required-Start: $remote_fs $syslog # Required-Stop: $remote_fs $syslog # Should-Start: $named autofs # Default-Start: 2 3 4 5 # Default-Stop: # Short-Description: fast remote file copy program daemon # Description: rsync is a program that allows files to be copied to and # from remote machines in much the same way as rcp. # This provides rsyncd daemon functionality. ### END INIT INFO set -e # /etc/init.d/rsync: start and stop the rsync daemon DAEMON=/usr/bin/rsync RSYNC_ENABLE=true RSYNC_OPTS='--address=10.1.1.2' RSYNC_DEFAULTS_FILE=/etc/default/rsync RSYNC_CONFIG_FILE=/etc/rsyncd.conf RSYNC_PID_FILE=/var/run/rsync.pid RSYNC_NICE_PARM='10' RSYNC_IONICE_PARM='-c3' test -x $DAEMON || exit 0 . /lib/lsb/init-functions if [ -s $RSYNC_DEFAULTS_FILE ]; then . $RSYNC_DEFAULTS_FILE case "x$RSYNC_ENABLE" in xtrue|xfalse) ;; xinetd) exit 0 ;; *) log_failure_msg "Value of RSYNC_ENABLE in $RSYNC_DEFAULTS_FILE must be either 'true' or 'false';" log_failure_msg "not starting rsync daemon." exit 1 ;; esac case "x$RSYNC_NICE" in x[0-9]|x1[0-9]) RSYNC_NICE_PARM="--nicelevel $RSYNC_NICE";; x) ;; *) log_warning_msg "Value of RSYNC_NICE in $RSYNC_DEFAULTS_FILE must be a value between 0 and 19 (inclusive);" log_warning_msg "ignoring RSYNC_NICE now." ;; esac case "x$RSYNC_IONICE" in xc[123]*) RSYNC_IONICE_PARM="$RSYNC_IONICE";; x) ;; *) log_warning_msg "Value of RSYNC_IONICE in $RSYNC_DEFAULTS_FILE must be -c1, -c2 or -c3;" log_warning_msg "ignoring RSYNC_IONICE now." ;; esac fi export PATH="${PATH:+$PATH:}/usr/sbin:/sbin" rsync_start() { if [ ! -s "$RSYNC_CONFIG_FILE" ]; then log_failure_msg "missing or empty config file $RSYNC_CONFIG_FILE" log_end_msg 1 exit 0 fi # See ionice(1) if [ -n "$RSYNC_IONICE_PARM" ] && [ -x /usr/bin/ionice ] && /usr/bin/ionice "$RSYNC_IONICE_PARM" true 2>/dev/null; then /usr/bin/ionice "$RSYNC_IONICE_PARM" -p$$ > /dev/null 2>&1 fi if start-stop-daemon --start --quiet --background \ --pidfile $RSYNC_PID_FILE --make-pidfile \ $RSYNC_NICE_PARM --exec $DAEMON \ -- --no-detach --daemon --config "$RSYNC_CONFIG_FILE" $RSYNC_OPTS then rc=0 sleep 1 if ! kill -0 $(cat $RSYNC_PID_FILE) >/dev/null 2>&1; then log_failure_msg "rsync daemon failed to start" rc=1 fi else rc=1 fi if [ $rc -eq 0 ]; then log_end_msg 0 else log_end_msg 1 rm -f $RSYNC_PID_FILE fi } # rsync_start case "$1" in start) if "$RSYNC_ENABLE"; then log_daemon_msg "Starting rsync daemon" "rsync" if [ -s $RSYNC_PID_FILE ] && kill -0 $(cat $RSYNC_PID_FILE) >/dev/null 2>&1; then log_progress_msg "apparently already running" log_end_msg 0 exit 0 fi rsync_start else if [ -s "$RSYNC_CONFIG_FILE" ]; then [ "$VERBOSE" != no ] && log_warning_msg "rsync daemon not enabled in $RSYNC_DEFAULTS_FILE, not starting..." fi fi ;; stop) log_daemon_msg "Stopping rsync daemon" "rsync" start-stop-daemon --stop --quiet --oknodo --pidfile $RSYNC_PID_FILE log_end_msg $? rm -f $RSYNC_PID_FILE ;; reload|force-reload) log_warning_msg "Reloading rsync daemon: not needed, as the daemon" log_warning_msg "re-reads the config file whenever a client connects." ;; restart) set +e if $RSYNC_ENABLE; then log_daemon_msg "Restarting rsync daemon" "rsync" if [ -s $RSYNC_PID_FILE ] && kill -0 $(cat $RSYNC_PID_FILE) >/dev/null 2>&1; then start-stop-daemon --stop --quiet --oknodo --pidfile $RSYNC_PID_FILE || true sleep 1 else log_warning_msg "rsync daemon not running, attempting to start." rm -f $RSYNC_PID_FILE fi rsync_start else if [ -s "$RSYNC_CONFIG_FILE" ]; then [ "$VERBOSE" != no ] && log_warning_msg "rsync daemon not enabled in $RSYNC_DEFAULTS_FILE, not starting..." fi fi ;; status) status_of_proc -p $RSYNC_PID_FILE "$DAEMON" rsync exit $? # notreached due to set -e ;; *) echo "Usage: /etc/init.d/rsync {start|stop|reload|force-reload|restart|status}" exit 1 esac exit 0 

 /etc/default/rsync # defaults file for rsync daemon mode # start rsync in daemon mode from init.d script? # only allowed values are "true", "false", and "inetd" # Use "inetd" if you want to start the rsyncd from inetd, # all this does is prevent the init.d script from printing a message # about not starting rsyncd (you still need to modify inetd's config yourself). RSYNC_ENABLE=true # which file should be used as the configuration file for rsync. # This file is used instead of the default /etc/rsyncd.conf # Warning: This option has no effect if the daemon is accessed # using a remote shell. When using a different file for # rsync you might want to symlink /etc/rsyncd.conf to # that file. # RSYNC_CONFIG_FILE= # what extra options to give rsync --daemon? # that excludes the --daemon; that's always done in the init.d script # Possibilities are: # --address=123.45.67.89 (bind to a specific IP address) # --port=8730 (bind to specified port; default 873) RSYNC_OPTS='--address=10.1.1.2' # run rsyncd at a nice level? # the rsync daemon can impact performance due to much I/O and CPU usage, # so you may want to run it at a nicer priority than the default priority. # Allowed values are 0 - 19 inclusive; 10 is a reasonable value. RSYNC_NICE='10' # run rsyncd with ionice? # "ionice" does for IO load what "nice" does for CPU load. # As rsync is often used for backups which aren't all that time-critical, # reducing the rsync IO priority will benefit the rest of the system. # See the manpage for ionice for allowed options. # -c3 is recommended, this will run rsync IO at "idle" priority. Uncomment # the next line to activate this. RSYNC_IONICE='-c3' # Don't forget to create an appropriate config file, # else the daemon will not start. 

LE我禁用了/ lib / lsb / init-functions中的其他脚本(通过rsync脚本引用):

 # Include hooks from other packages in /lib/lsb/init-functions.d #for hook in $(run-parts --lsbsysinit --list /lib/lsb/init-functions.d 2>/dev/null); do # [ -r $hook ] && . $hook || true #done 

而不是在/etc/init.d/rsync中显式加载每个系统脚本

 . /lib/lsb/init-functions . /lib/lsb/init-functions.d/01-upstart-lsb . /lib/lsb/init-functions.d/20-left-info-blocks #. /lib/lsb/init-functions.d/40-systemd . /lib/lsb/init-functions.d/50-ubuntu-logging . /lib/lsb/init-functions.d/99-plymouth 

这就是我发现导致问题的脚本是“40系统”的原因。

事实上,这个40系统的脚本有一个testing脚本是否在/etc/init.d中运行的部分

  if [ $PPID -ne 1 ] && [ -z "${init:-}" ] && [ -z "${_SYSTEMCTL_SKIP_REDIRECT:-}" ]; then case $(readlink -f "$0") in /etc/init.d/*) _use_systemctl=1 # Some services can't reload through the .service file, # but can through the init script. if [ "$(systemctl -p CanReload show $service 2>/dev/null)" = "CanReload=no" ] && [ "${1:-}" = "reload" ]; then _use_systemctl=0 fi ;; esac else export _SYSTEMCTL_SKIP_REDIRECT="true" fi fi 

我不明白在这个代码中发生了什么…

LLE经过进一步的调查后发现问题是由于没有更新服务参数的systemd造成的。

所以,我像下面那样手动编辑/lib/systemd/system/rsync.service,做了一个systemctl守护进程重载,现在/etc/init.d/rsync以正确的参数开始。

 [Service] ExecStart=/usr/bin/rsync --daemon --no-detach --address='10.1.1.2' 

希望这将帮助别人切实解决类似的问题….