初期化スクリプトのコマンドは実行を拒否したり、実際には何もしません。

初期化スクリプトのコマンドは実行を拒否したり、実際には何もしません。

編集 - この行が犯人であることが判明しました . /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は、先ほどしたようにstartargを使用してスクリプトを再実行します。今回は環境が維持されるため、インクルード_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

関連情報