초기화 스크립트의 명령이 실행을 거부하거나 실제로 작업을 수행하지 않습니다.

초기화 스크립트의 명령이 실행을 거부하거나 실제로 작업을 수행하지 않습니다.

편집 - 이 줄이 범인인 것으로 밝혀졌습니다 . /lib/lsb/init-functions

해당 줄을 주석 처리하면 명령이 실제로 작동합니다. 왜 그럴까요? 아무 문제 없이 다른 init 스크립트에서 이 파일을 가져올 수 있습니다.

/etc/init.d그래서 내가 넣고 실행하는 스크립트가 있습니다 update-rc.d. 다음을 사용하여 이 명령을 실행할 수 sudo /etc/init.d/usbstorage start있으며 명령이 시작되었다는 메시지를 받을 수 있지만 어떤 명령도 효과가 없습니다. 다음과 같은 간단한 명령을 입력하여 이를 확인할 수 있습니다.

echo "here here maytee" > /home/pi/some_file.txt"

스크립트에서 파일을 실행한 후에는 파일이 존재하지 않습니다. 참조용으로 일부 스크립트가 아래에 게시되어 있습니다.

#! /bin/sh
### BEGIN INIT INFO
# Provides:          usbstorage
# Required-Start:    $local_fs
# Required-Stop:
# Default-Start:     S
# Default-Stop:      0 6
# Short-Description: Automounts external storage if found.
### END INIT INFO

PATH=/sbin:/bin

. /lib/lsb/init-functions

do_start () {
    umount /dev/sda1 2> /dev/null || echo "sda1 not already mounted"
    mkdir /mnt/usbstorage 2> /dev/null || echo "/mnt/usbstorage already exists"
    mount /dev/sda1 /mnt/usbstorage
    chown -R pi:pi /mnt/usbstorage
    echo "Started usbstorage"
}
do_stop () {
    umount /dev/sda1 || echo "sda1 not already mounted"
}

case "$1" in
  start)
        do_start
        ;;
  restart|reload|force-reload)
    do_stop || echo 1
    do_start
        ;;
  stop|status)
        # No-op
        ;;
  *)
        echo "Usage: $0 start|stop" >&2
        exit 3
        ;;
esac

명령 실행이 거부되는 이유는 무엇입니까? 처음에는 뭔가 조용히 실패한 것 같았습니다.

- - 편집하다

그래서 다음 명령을 실행했습니다.

sudo -i 
bash -x /etc/init.d/usbstorage start

이 출력을 얻으십시오

[ ok ] Starting usbstorage (via systemctl): usbstorage.service.
root@johns-box:~# bash -x /etc/init.d/usbstorage start
+ PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin
+ . /lib/lsb/init-functions
+++ run-parts --lsbsysinit --list /lib/lsb/init-functions.d
++ for hook in '$(run-parts --lsbsysinit --list /lib/lsb/init-functions.d 2>/dev/null)'
++ '[' -r /lib/lsb/init-functions.d/20-left-info-blocks ']'
++ . /lib/lsb/init-functions.d/20-left-info-blocks
++ for hook in '$(run-parts --lsbsysinit --list /lib/lsb/init-functions.d 2>/dev/null)'
++ '[' -r /lib/lsb/init-functions.d/40-systemd ']'
++ . /lib/lsb/init-functions.d/40-systemd
+++ _use_systemctl=0
+++ '[' -d /run/systemd/system ']'
+++ '[' -n '' ']'
+++ '[' 15898 -ne 1 ']'
+++ '[' -z '' ']'
+++ '[' -z '' ']'
+++ case $(readlink -f "$0") in
++++ readlink -f /etc/init.d/usbstorage
+++ _use_systemctl=1
+++ prog=usbstorage
+++ service=usbstorage.service
++++ systemctl -p CanReload show usbstorage.service
+++ '[' CanReload=no = CanReload=no ']'
+++ '[' start = reload ']'
+++ '[' 1 = 1 ']'
+++ set +e
+++ set +u
+++ '[' xstart = xstart -o xstart = xstop -o xstart = xrestart -o xstart = xreload -o xstart = xforce-reload -o xstart = xstatus ']'
+++ systemctl_redirect /etc/init.d/usbstorage start
+++ local s
+++ local rc
+++ local prog=usbstorage
+++ local command=start
+++ case "$command" in
+++ s='Starting usbstorage (via systemctl)'
+++ service=usbstorage.service
++++ systemctl -p LoadState show usbstorage.service
+++ state=LoadState=loaded
+++ '[' LoadState=loaded = LoadState=masked ']'
+++ '[' start = status ']'
+++ log_daemon_msg 'Starting usbstorage (via systemctl)' usbstorage.service
+++ '[' -z 'Starting usbstorage (via systemctl)' ']'
+++ log_daemon_msg_pre 'Starting usbstorage (via systemctl)' usbstorage.service
+++ log_use_fancy_output
+++ TPUT=/usr/bin/tput
+++ EXPR=/usr/bin/expr
+++ '[' -t 1 ']'
+++ '[' xxterm-256color '!=' x ']'
+++ '[' xxterm-256color '!=' xdumb ']'
+++ '[' -x /usr/bin/tput ']'
+++ '[' -x /usr/bin/expr ']'
+++ /usr/bin/tput hpa 60
+++ /usr/bin/tput setaf 1
+++ '[' -z ']'
+++ FANCYTTY=1
+++ case "$FANCYTTY" in
+++ true
+++ echo -n '[....] '
[....] +++ '[' -z usbstorage.service ']'
+++ echo -n 'Starting usbstorage (via systemctl): usbstorage.service'
Starting usbstorage (via systemctl): usbstorage.service+++ log_daemon_msg_post 'Starting usbstorage (via systemctl)' usbstorage.service
+++ :
+++ /bin/systemctl start usbstorage.service
+++ rc=0
+++ '[' start = status ']'
+++ log_end_msg 0
+++ '[' -z 0 ']'
+++ local retval
+++ retval=0
+++ log_end_msg_pre 0
+++ log_use_fancy_output
+++ TPUT=/usr/bin/tput
+++ EXPR=/usr/bin/expr
+++ '[' -t 1 ']'
+++ '[' xxterm-256color '!=' x ']'
+++ '[' xxterm-256color '!=' xdumb ']'
+++ '[' -x /usr/bin/tput ']'
+++ '[' -x /usr/bin/expr ']'
+++ /usr/bin/tput hpa 60
+++ /usr/bin/tput setaf 1
+++ '[' -z 1 ']'
+++ true
+++ case "$FANCYTTY" in
+++ true
++++ /usr/bin/tput setaf 1
+++ RED=''
++++ /usr/bin/tput setaf 2
+++ GREEN=''
++++ /usr/bin/tput setaf 3
+++ YELLOW=''
++++ /usr/bin/tput op
+++ NORMAL=''
+++ /usr/bin/tput civis
+++ /usr/bin/tput sc
+++ /usr/bin/tput hpa 0
+++ '[' 0 -eq 0 ']'
+++ /bin/echo -ne '[ ok '
[ ok +++ /usr/bin/tput rc
+++ /usr/bin/tput cnorm
+++ log_use_fancy_output
+++ TPUT=/usr/bin/tput
+++ EXPR=/usr/bin/expr
+++ '[' -t 1 ']'
+++ '[' xxterm-256color '!=' x ']'
+++ '[' xxterm-256color '!=' xdumb ']'
+++ '[' -x /usr/bin/tput ']'
+++ '[' -x /usr/bin/expr ']'
+++ /usr/bin/tput hpa 60
+++ /usr/bin/tput setaf 1
+++ '[' -z 1 ']'
+++ true
+++ case "$FANCYTTY" in
+++ true
++++ /usr/bin/tput setaf 1
+++ RED=''
++++ /usr/bin/tput setaf 3
+++ YELLOW=''
++++ /usr/bin/tput op
+++ NORMAL=''
+++ '[' 0 -eq 0 ']'
+++ echo .
.
+++ log_end_msg_post 0
+++ :
+++ return 0
+++ return 0
+++ exit 0

답변1

TL;박사 시작 스크립트는 이미 "시작"되었기 때문에 아무 작업도 수행하지 않습니다.시스템이 말했다. 당신은해야합니다멈추다그럼 넌 할 수 있어시작그것.

쉘 추적 출력에서 ​​볼 수 있듯이 다음을 실행하면

sudo /etc/init.d/usbstorage start

운영 체제에서 사용체계선호하는 관리자로서(귀하의 경우입니다) 다음 라인은

. /lib/lsb/init-functions

SysV 스타일 스크립트에서 쉘 코드가 생성됩니다.

/lib/lsb/init-functions.d/40-systemd

달리다. 기본적으로 파일과 동등한 시스템이 필요하다고 생각하므로 인쇄합니다.

Starting usbstorage (via systemctl)

그런 다음 실행

/bin/systemctl start usbstorage.service

그리고 거기에서 나가세요. 나머지 스크립트는 이 특정 프로세스에서 실행되지 않습니다.

그러나 누군가가 호출할 때마다 모든 스크립트가 구문 분석되고 각 스크립트에 대해 systemctl daemon-reload(시작 시) 또는 ./etc/init.d/*/run/systemd/generator//run/systemd/generator.late/

각 스크립트의 주석 블록은 ### BEGIN INIT INFO동등한 시스템 종속성으로 변환됩니다. 스크립트의 단위 파일 usbstorage.service에는 다음 줄이 포함됩니다.

RemainAfterExit=yes
ExecStart=/etc/init.d/usbstorage start
ExecStop=/etc/init.d/usbstorage stop

/bin/systemctl start usbstorage.service따라서 스크립트 실행이 끝나기 전에 발행된 Final은 start방금 했던 것처럼 arg 를 사용하여 스크립트를 다시 실행합니다. 이번에는 환경이 유지되므로 _SYSTEMCTL_SKIP_REDIRECT=true포함으로 40-systemd인해 더 이상 재귀가 발생하지 않고 대신 스크립트가 정상적으로 실행됩니다.

그렇다면 실행하면 왜 아무 일도 하지 않는 걸까요?

모든 것이 준비되어 있습니다 RemainAfterExit=yes. 이로 인해 systemd는 다음 사실을 기록합니다.시작완료되었으므로 다른 것을 발행하면시작이미 실행 중이므로 아무 작업도 수행되지 않습니다.

발급을 하셔야 합니다멈추다먼저, 다음은 당신의 것입니다.시작실제로 스크립트가 완전히 실행됩니다. 다음과 같이 서비스의 현재 상태를 확인할 수 있습니다.

$ sudo systemctl status usbstorage.service
* usbstorage.service - LSB: Automounts external storage if found.
   Loaded: loaded (/etc/init.d/usbstorage)
   Active: active (exited) since Thu 2016-07-28 15:37:24 CEST; 26min ago
  Process: 7977 ExecStart=/etc/init.d/usbstorage start (code=exited, status=0/SUCCESS)

Jul 28 15:37:23 three usbstorage[7977]: <stdout/stderr of your script>

그것이 말하는 것에 주의를 기울이십시오 active (exited). 로그에서 메시지를 찾을 수 있습니다.

sudo journalctl -u usbstorage

관련 정보