編集 - この行が犯人であることが判明しました
. /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