web-dev-qa-db-ja.com

ステップEXECの生成で失敗:そのようなファイルまたはディレクトリはありません

起動時に有効になる次のワンショットサービスがあるとします。

_[Unit]

Description = My Server Daemon
Documentation = https://etcetc.org

Wants = network-online.target getty.target NetworkManager-wait-online.service isc-dhcp-server.service xinetd.service smbd.service
After = network-online.target getty.target NetworkManager-wait-online.service isc-dhcp-server.service xinetd.service smbd.service

[Service]

Type = oneshot

RemainAfterExit = yes

User = foouser

PIDFile = /run/myd.pid

WorkingDirectory = /home/foouser/my-server/bin

ExecStart = /home/foouser/my-server/bin/myd
ExecStop = /home/foouser/my-server/bin/abort.sh

TimeoutStopSec = 5

[Install]

WantedBy = multi-user.target
_

実際には起動しません。フィルタリング_/var/log/syslog_

systemd [1]:myd.service:/ home/foouser/my-server/bin/myを生成するステップCHDIRで失敗:そのようなファイルまたはディレクトリはありません

_journalctl --unit=myd.service_が同意する間

systemd [1]:myd.service:メインプロセスが終了しました、コード=終了、ステータス= 200/CHDIR

したがって、_/home/foouser/my-server/bin/myd_は私の__から_/home/foouser/my-server/xspyctra/xspyctrad.py_へのソフトリンクであるため、

  1. 変更された_ExecStart = /home/foouser/my-server/xspyctra/xspyctrad.py_
  2. コメント付きWorkingDirectory pythonスクリプトは独自にos.chdir('/home/foouser/my-server/bin')を実行するため、実際には興味がありません。

サービスのリロード、システムの再起動など。しかし、今、私は次のエラーから気絶しています

systemd [1653]:myd.service:/home/foouser/my-server/xspyctra/xspyctrad.pyを生成するステップEXECで失敗しました:そのようなファイルまたはディレクトリはありません

systemd [1]:myd.service:メインプロセスが終了しました、コード=終了、ステータス= 203/EXEC

そのファイルが存在することを確認できます

_$ ls -l /home/foouser/my-server/xspyctra/xspyctrad.py
-rwxrw-r-- 1 foouser foouser 5532 May 10 16:13 /home/foouser/my-server/xspyctra/xspyctrad.py
_

最後の診断として、_service myd status_

_● myd.service - My Server Daemon
  Loaded: loaded (/etc/systemd/system/myd.service; enabled; vendor preset: enabled)
  Active: failed (Result: exit-code) since Fri 2018-05-11 10:58:21 CEST; 16min ago
  Docs: https://etcetc.org
  Main PID: 1627 (code=exited, status=203/EXEC)
_

編集1

ただし、これは何らかの理由で起動時にのみ発生する可能性があります。実際のところ、

_Sudo service myd stop
Sudo service myd start
_

_service myd status_

_● myd.service - My Server Daemon
     Loaded: loaded (/etc/systemd/system/myd.service; enabled; vendor preset: enabled)
     Active: activating (start) since Fri 2018-05-11 11:22:52 CEST; 1min 16s ago
       Docs: https://etcetc.org
   Main PID: 2106 (python2)
      Tasks: 24
     Memory: 545.1M
        CPU: 10.913s
     CGroup: /system.slice/myd.service
       ├─2106 python2 /home/foouser/my-server/bin/myd
       ├─2122 ./<my-child-process-a>
       ├─2127 ./<my-child-process-b>
       └─2133 ./<my-child-process-c>
_

予想通り。さらに、実際のスクリプトである_xspyctrad.py_は_twisted.reactor_を生成するので、フォアグラウンドに戻らず、そのまま残ります。

それで私の間違いはどこにあるのでしょうか?

1

実行可能ファイルを早期にアクセス可能な場所に移動する(これはとにかく良いことです)ことに加えて、マウントの依存関係を指定して、その場所がマウントされて利用可能になるまでsystemdにユニットの起動を遅らせるように指示できます。

RequiresMountsFor=

[Unit]
RequiresMountsFor=/home/foouser/my-server/bin

または Requires= / After= 対応する .mount unitwhatが正確にわかっている場合、マウントする必要があります:

[Unit]
Requires=home-foouser.mount
After=home-foouser.mount
2
intelfx

カミルが指摘したように、/home/foouser/は、サービスの開始時に存在していません。既存の場所に移動すると問題が解決しました。

1