有効なsystemdサービスが起動時に開始しないのはなぜですか?


20

次のsystemdユニットファイルがあります/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

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

回答:


9

なぜかわからないが、これを機能させるには:

削除された Environment=DISPLAY=:%i

User=変数を追加しました

正しいファイルが入っていることを確認しました/etc/systemd/system/emacs.service(以前はハードリンクでした)

そして再走った systemctl enable emacs

これにより機能しました。

編集 ここでの本当の問題は、3行目でタイプミスがあったことです。 Documentatin

私はこれをチェックして見つけましたjournalctl。systemdスクリプトに問題がある人は、stderrにエラーが送信されなかったのと同じことをお勧めします。


再起動でも機能しますか?デーモンモードがX11接続を必要としない場合、After=...私は言及した必要はないと思います。
アレクシスウィルケ

1
はい、再起動後に機能します。これはグラフィカルなEmacsではないため、X11は必要ありません。これは例からコピーした行であり、注意を払っていません。
Startec

3

おお、これは面白い。

ランダムなサービスユニットを選択してそれをじっと見ると、それはの代わりに特定のターゲットに依存しdefault.targetます。後者はシンボリック...特定のターゲットへの設定されたリンクであり、意味的には意味がありません。(を参照systemctl set-default

サービスdisabledを有効にすると、サービスが表示される理由を説明できます。たとえば、default.targetサービスファイルをに置き換えてみてくださいmulti-user.target

(有効化に失敗したときにエラーを報告しないことはsystemdの欠陥のように思われます。現在ディレクトリを持っているのではないかと思います/etc/systemd/system/default.target.wants)。


journalctlコマンドは、何が壊れたのかを示します(たとえば、イネーブルが失敗した理由など)。リンクについては、独自のパーソナルサービスを作成する場合は必要ありません。あなたが/削除をインストールするために他人をしたいというパッケージを作成する場合はなど、問題ありません
アレクシス・ヴィルケ

@AlexisWilkeそれはさらに悪いだろう!いくつかのエラーをstderrに報告し、他のエラーをジャーナルに報告するように書かれているのはなぜですか?
sourcejedi

ジャーナルにすべてを書き込みます。私が見たものから、デーモンを開始できなかった場合にのみ、非常に基本的なsystemd固有のエラーが表示されます。
アレクシスウィルケ

2
ユーザーは基本的なエラーさえ報告しませんでした。彼らは操作が成功したと信じていたため、再起動に進みました。額面では、systemdに欠陥があります。ユーザーにも障害モードがありますが、エラーメッセージを完全に見落とすことはこの質問では非常に可能性が高いように思えます。
sourcejedi

1
@sourcejediどのようにこれを知っているのかわかりませんが、はい、/etc/systemd/system/default.target.wants Insideに私のサービスファイルのリストがあります。そして、はい、エラーがあるとは思いもしませんでした。
Startec

1

DISPLAY環境変数があるため、X11を起動する必要があります。そのため、それまでサービスをブロックする方法が必要です。

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

私はそれを自分でやったことがないので、それがうまくいくと言うことはできませんが、おそらくそれは何かと関係がありgraphical.targetます。

[Unit]
After=graphical.target

別の可能性として、Xサーバーがすぐに起動しない場合(つまり、lightdmなどのログイン画面がある場合)、WantedBy=...代わりに使用する必要があります。

[Unit]
WantedBy=graphical.target

systemdで動作するのに飽きた場合、X-Windowsマネージャーがそれを動作させる通常の方法を調べてください。

~/.xprofileファイルがあり、ファイルのように~/.bashrc機能します。

~/.config/autostart/*.desktopファイルもあります。そこに定義されているアプリケーションを自動的に起動します。

これらのソリューションはシステム全体ではありませんが、複数のユーザーがいる場合、各ユーザーが独自のエントリを持っている必要があります。また、アプリケーションをルートとして起動するのではなく、ユーザーとして起動します。


サイドノートとして、「loaded + inactive(dead)」メッセージは、systemdがプロセスを開始するのに苦労し、その結果、プロセスを中止することを決定したことを意味します。次name.serviceを使用して、再起動後に機能することを手動でテストできます。

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

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

 systemctl status <service-name>

2
うーん、その行全体を削除しましたが、何も変わりませんでした。また、(私の質問で言ったように)systemctl start emacsを実行することでうまく起動します)。
Startec

更新された質問をご覧ください。にタイプミスがありましたDocumentatin。あなたのヒントjournalctlはここで私を助けました。
Startec

0

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

これには多くの手動の代替手段があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.