起動時にアクティブなシステムサービスが起動しないのはなぜですか?

起動時にアクティブなシステムサービスが起動しないのはなぜですか?

次のシステム単位ファイルがあります/etc/systemd/system/emacs.service

[Unit]
Description=Emacs: the extensible, self-documenting text editor
Documentatin=man:emacs(1) info:Emacs


[Service]
Type=forking
ExecStart=/usr/bin/emacs --daemon
ExecStop=/usr/bin/emacsclient --eval "(progn (setq kill-emacs-hook nil) (kill-emacs))"
Restart=always
Environment=DISPLAY=:%i
TimeoutStartSec=0

[Install]
WantedBy=default.target

起動時に起動したいので、次のように入力しました。systemctl enable emacs

ただし、サービスが再起動されるたびに、次のものsystemctl status emacsが表示されます。

● emacs.service - Emacs: the extensible, self-documenting text editor
   Loaded: loaded (/etc/systemd/system/emacs.service; disabled; vendor preset: enabled)
   Active: inactive (dead)

ただし、systemctl start emacsステータスを入力して確認すると、次のものが返されます。

● emacs.service - Emacs: the extensible, self-documenting text editor
   Loaded: loaded (/etc/systemd/system/emacs.service; disabled; vendor preset: enabled)
   Active: active (running) since Fri 2016-11-11 23:03:59 UTC; 4s ago
  Process: 3151 ExecStart=/usr/bin/emacs --daemon (code=exited, status=0/SUCCESS)
 Main PID: 3154 (emacs)
    Tasks: 2
   Memory: 7.6M
      CPU: 53ms
   CGroup: /system.slice/emacs.service
           └─3154 /usr/bin/emacs --daemon

起動時にこのプロセスを正常に開始するにはどうすればよいですか?

答え1

理由はわかりませんが、正しく機能させるには、次の手順を実行します。

削除済みEnvironment=DISPLAY=:%i

User=変数を追加しました

正しいファイルがあることを確認してください/etc/systemd/system/emacs.service(ハードリンクの前)。

そして再実行systemctl enable emacs

これはうまくいきます。

編集する ここで本当の問題は、3行にタイプミスがあるということです。 Documentatin

を確認しながら知りましたjournalctl。 stderrにエラーが送信されないため、systemdスクリプトに問題がある人なら誰でも同じことをお勧めします。

答え2

DISPLAY 環境変数があります。これはX11を起動することを意味します。したがって、それまではサービスをブロックする方法が必要です。

これは以下を使用して行われます。After=...オプション

私は自分でやったことがないので効果があるとは言えませんがgraphical.target

[Unit]
After=graphical.target

もう1つの可能性は、Xサーバーがすぐに起動しない場合(たとえば、lightdmなどのログイン画面がある場合)、次のものを使用する必要があるかもしれません。WantedBy=...代わりに:

[Unit]
WantedBy=graphical.target

systemdで作業するのに疲れた場合は、X-Windows管理者が作業を実行する一般的な方法を見たいと思うかもしれません。

~/.xprofileファイルのように動作するファイルがあります~/.bashrc

文書もあります~/.config/autostart/*.desktop。定義されたすべてのアプリケーションが自動的に起動します。

ただし、これらのソリューションはシステム全体には適用されず、複数のユーザーがいる場合は、各ユーザーに独自のエントリが必要です。また、アプリケーションをrootとして起動せずに、ユーザーとしてアプリケーションを起動します。


ちなみに、「loaded + inactive(dead)」メッセージは、systemdがプロセスを開始するのに苦労したことを意味するために決定されました。あきらめるそれ。name.service次のコマンドを使用して、再起動後に機能していることを手動でテストできます。

systemctl stop <service-name>
systemctl start <service-name>

これは更新する情報が正しいと仮定すると、ステータスとサービスが正しく開始されます。その後、ステータスを再確認して追加の詳細を確認できます。

systemctl status <service-name>

答え3

サービスを有効にしたら、リンクがどこにあるかを確認してください。これについて私の考えを追加するだけです。実行するとsudo systemctl enable myserevice.serviceフォルダにリンクが作成されますが、multi-user.target.wants実際のリンクには作成されませんmulti-user.target.wants。同じ名前の新しいフォルダに作成されます。WantedBy=multi-user.target私のテキストエディタにはいくつかの追加文字が表示されません。だから私はそれが何であるかわかりません。別の.serviceファイルでc / pを使用して再度有効にしましたが、リンクは正しいフォルダにあります。

答え4

これは複数のDebianサービスファイルのバグです:

# systemctl enable watchdog
Synchronizing state of watchdog.service with SysV init with /lib/systemd/systemd-sysv-install...
Executing /lib/systemd/systemd-sysv-install enable watchdog
# find /etc/systemd/ | grep watch
# tail -n2 /lib/systemd/system/watchdog.service

[Install]

https://www.raspberrypi.org/forums/viewtopic.php?f=82&t=218609&p=1406567#p1406567 https://forum.armbian.com/topic/9115-still-dont-know-where-to-report-bugs-watchdogservice-refuses-to-start-due-to-broken-service-file/

展開レベルの変更は次のとおりです。

echo "WantedBy=default.target" >> /lib/systemd/system/watchdog.service
systemctl daemon-reexec
systemctl enable watchdog
systemctl stop watchdog.service
systemctl start watchdog.service

手動で置き換える方法はたくさんあります。

関連情報