web-dev-qa-db-ja.com

ユーザーのログイン後にsystemdサービスを開始し、ユーザーのログアウト前に停止する方法

Fedora 23マシンを持っています。

ローカルの/ homeディレクトリをリモートディレクトリ(NASマシン内)に同期するディレクトリ/ファイル同期bashスクリプトがあります。手動で実行しますが、systemdサービスを作成し、他の人が自分のユーザー資格情報を使用して私のPCを使用するので、それをより柔軟にします。ユーザーがいつログインし、後でサービスを開始するかを知りたいのですが。

サービスのsystemdファイルからできることはありますか、それともスクリプトのコードから確認する必要がありますか?

環境変数($ USERなど)にアクセスできることを確認し、それをサービスとして実行するだけです。

ドキュメントの主なソースはこのリンクです https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/System_Administrators_Guide/sect-Managing_Services_with_systemd-Unit_Files.html

10
GeorgeKaf

systemdを使用するすでにユーザーセッションのサポートが含まれていますが、実際には(無意識のうちに)依存しているはずです。

サービスディレクトリを作成

mkdir -p $HOME/.local/share/systemd/user

サービスファイルの作成(vim、gedit、geany-何でも好きなもの)

vim $HOME/.local/share/systemd/user/my.service

永続的なサービスの場合、おおよそ次のようになります。

[Unit]
Description=My very own Service
[Service]
Type=simple
TimeoutStartSec=0
ExecStart=/path/to/start/script arguments
[Install]
WantedBy=default.target

しかし、一度トリガーしたいので、それでうまくいきたいので、次のようなワンショット構成を使用してください:

[Service]
Type=oneshot
RemainAfterExit=true
StandardOutput=journal
ExecStart=/path/to/start/script arguments
ExecStop=/path/to/stop/script arguments
[Install]
WantedBy=default.target

もちろん、これはスクリプトが実行可能であることを前提としています。

chmod a+x /path/to/start/script
chmod a+x /path/to/stop/script

それ以外の場合は、それぞれのインタープリターへのパスを付加する必要があります。

ExecStart=/bin/bash /path/to/start/script arguments

Systemdをリロードします(そしてテストのために再ログインします)。

systemctl --user enable my.service # enables the service
systemctl --user # should display your new unit in the list
journalctl --user should show the log

さらに情報が必要な場合は、たとえば Arch-Wiki を参照してください。 This askubuntuスレッドには、偶然にも私のようなさまざまなアイデアがあります。

サービスをグローバルに定義することにより、(rootの場合)動作を他のユーザーに拡張できます。これを行うには、サービスファイルを/ usr/share/systemd/user /ではなく$ HOME/.local/share/systemd/userに作成する必要があります。 。

14
anx