サービスファイルは存在しますが、systemd では見つかりません

サービスファイルは存在しますが、systemd では見つかりません

systemd サービス ファイルを作成し、 に配置しました/etc/systemd/system/anfragen-3dkonfig-mapper.service。 を実行しsystemctl daemon-reloadsystemctl daemon-reexecシステムを再起動しました。

  • systemctl enable anfragen-3dkonfig-mapper結果的に

    Failed to enable unit: Unit file anfragen-3dkonfig-mapper.service does not exist.
    
  • systemctl start anfragen-3dkonfig-mapper結果的に

    Failed to start anfragen-3dkonfig-mapper.service: Unit anfragen-3dkonfig-mapper.service not found.
    
  • ls -lh /etc/systemd/system/anfragen-3dkonfig-mapper.service出力

    -rw-r--r--. 1 root root 440 Mar 19 12:08 /etc/systemd/system/anfragen-3dkonfig-mapper.service
    
  • cd /root && systemd-analyze verify anfragen-3dkonfig-mapper.service終了コードは 0 で、出力は何も印刷されません。

  • mountショー

    /dev/sda2 on / type xfs (rw,relatime,seclabel,attr2,inode64,noquota)
    
  • 接触している他のマウントはありませ/usr/etc

  • サービス ファイルの内容は次のとおりです。

    [Unit]
    Description=Anfragen 3D Konfigurations Mapper Service
    After=network.target
    
    [Service]
    Restart=always
    ExecStartPre=-/usr/bin/podman stop anfragen-3dkonfig-mapper
    ExecStartPre=-/usr/bin/podman rm anfragen-3dkonfig-mapper
    ExecStart=/usr/bin/podman run --rm --name anfragen-3dkonfig-mapper-app -p 10010:10000 anfragen-3dkonfig-mapper-app:0.0.1
    ExecStop=/usr/bin/podman stop anfragen-3dkonfig-mapper
    
    [Install]
    WantedBy=multi-user.target
    
  • 上記のコマンドはすべてユーザーとして実行されましたroot

  • オペレーティング システム: CentOS Linux リリース 8.0.1905 (Core)
  • Systemd バージョン: 239
  • Linux カーネル:Linux version 4.18.0-80.11.2.el8_0.x86_64 ([email protected]) (gcc version 8.2.1 20180905 (Red Hat 8.2.1-3) (GCC))
  • 数か月前に別のサービス ファイルで同様の問題が発生したことをぼんやりと覚えていますが、数時間調べてサービス ファイルの名前を変更した後、魔法のように動作するようになりました。

私は2つのことに興味があります:

  • このような問題をどのようにデバッグするのでしょうか?
  • なにが問題ですか?

答え1

@JdeBP が示唆しているように、SELinux ファイル ラベルが間違っていることがこの動作の原因です。.の出力の 文字は、ファイルにセキュリティ コンテキストが設定されていることを示します。したがって、出力lsの に注意してください。.ls

cd /etc/systemd/system && ls -lhZ some-other-service.service anfragen-3dkonfig-mapper.serviceプリント

-rw-r--r--. 1 root root unconfined_u:object_r:admin_home_t:s0        440 Mar 19 12:08 anfragen-3dkonfig-mapper.service
-rw-r--r--. 1 root root unconfined_u:object_r:systemd_unit_file_t:s0 457 Feb 24 11:42 some-other-service.service

systemd_unit_file_t他のサービス ファイルにはラベルがありますが、壊れたサービスにはラベルがないことがわかります。これは で修正できますrestorecon anfragen-3dkonfig-mapper.service。その後、ラベルは次のようになります。

-rw-r--r--. 1 root root unconfined_u:object_r:systemd_unit_file_t:s0 440 Mar 19 12:08 anfragen-3dkonfig-mapper.service
-rw-r--r--. 1 root root unconfined_u:object_r:systemd_unit_file_t:s0 457 Feb 24 11:42 some-other-service.service

systemd は期待どおりに動作するようになりました。

答え2

-rw-r--r--. 

SELinux の制限により、生活が複雑になっています。

答え3

サービス ファイルをいくつか移動した後、この問題の追跡に 1 時間費やしました。 のシンボリック リンクは/lib/systemd/system正しいファイルを指していましたが、 のシンボリック リンクは/etc/systemd/systemそうではありませんでした (ターゲットが存在しなくなっていました)。この問題のある (壊れた) シンボリック リンクを削除し、正しいシンボリック リンクに置き換えたところ、問題は解決しました。

答え4

同様の問題がありましたが、Centos7 でルートレス podman を使用しています。

コンテナは再起動後に起動されず、サービスが見つかりませんでした。ただし、再起動前にはサービスは有効になっており、/etc/systemd/system に存在していました。サービスは、/home/user から /etc/systemd への syslink ln -s によって作成されました。

再起動後に実行すると、Systemctl status nameOfService.service「Unit servicename.service が見つかりませんでした。」が返されます。

実行すると、systemctl daemon-reloadサービスが再び表示されます。

1 つの解決策としては、/root/ から /etc/systemd/system への syslink ln -s を作成することです。再起動後もサービスは存続します。

より良い解決策

  • daemon-reloadを実行してサービスを開始する独自のサービスを作成します。

daemon-reload とサービスの開始を含む startServiceOnBoot.sh スクリプトを作成します。

    #!/bin/bash 
    sudo systemctl daemon-reload    
    sudo systemctl start nameOfService.service

sh スクリプトを実行可能にするchmod +x startServiecOnBoot.sh

サービス /etc/systemd/system/serviceStarter.service を作成します。

[Unit]
Description=Daemon Reloader
...

[Service]
ExecStart=/home/user/startServiecOnBoot.sh
...

[Install]
WantedBy=multi-user.target

起動時にサービスを有効にすると、systemctl enable serviceStarter.service新しいサービス serviceStarter.service を開始すると実際に nameOfService.service も開始されるかどうかを確認することもできます。

systemdのサービスでAfter=と.timerを試しましたが、成功しませんでした。デバッグには$systemd-analyzeblame

関連情報