注意
Dropboxクライアントの仕様変更により、CentOS7で本稿の方法ではCentOS7でDropboxクライアントを実行できなくなりました。あらためて対応方法を「Docker版DropboxクライアントをCentOS7サーバで動作させる」で紹介したので、ご覧ください。
はじめに
CentOS7サーバにLinux版のDropboxクライアントをインストールし、systemd管理下でサービス起動させてみた。
通常、Dropboxクライアントは特定ユーザの権限で動かすものなので、systemdのユニットテンプレートを使用してマルチユーザに対応して動くようにした。
インストール
まず、以下のサイトの「コマンド ラインを使った Dropbox のヘッドレス インストール」を参照して、ヘッドレス版のDropboxクライアントをインストールする。(インストール方法は他のサイトでも紹介されているので割愛)
また、このサイトからコマンドライン版のdropbox管理スクリプト(dropbox.py)をダウンロードする。これを。~/bin/dropbox.py
に配置していると仮定する。
ここまでで、以下のコマンドでDropboxクライアントが起動/終了できるようになる。
~/bin/dropbox.py start
~/bin/dropbox.py stop
ユニットファイルの作成
Dropboxクライアントをsystemdで管理できるようにユニットファイルを作成する。
以下の内容を /etc/systemd/system/dropbox@.service
として作成する。ファイル名に含まれる@
は、このユニットがテンプレートであることを示す。テンプレートユニットは、実行時に複数のインスタンスを起動できるようにするもので、ユニットファイルをうまく作れば、パラメータを初めとする実行条件をインスタンス毎に切り替えることができる。この機能は、従来のSysV initに存在しない、systemd の利点の1つだ。
[Unit]
Description=Dropbox client (user: %i)
After=syslog.target network.target
[Service]
ExecStart=/bin/bash -c "sudo -u '%i' /home/%i/bin/dropbox.py start"
ExecStop=/bin/bash -c "sudo -u '%i' /home/%i/bin/dropbox.py stop"
Restart=no
Type=forking
[Install]
WantedBy=multi-user.target
上記のファイルを作成したら、systemctl daemon-reload
で反映しておく。
実行
systemctl start dropbox@ユーザ名
たとえば、Dropboxクライアントをインストールしたユーザがaliceならば、以下のようにして実行する。
systemctl start dropbox@alice
もちろん、enable サブコマンドで自動起動も可能。
systemctl enable dropbox@alice
解説編
systemdのテンプレートユニットでは、@
以降がインスタンス名として扱われるので、これを実行ユーザ名として扱えばよい。ユニットファイルの中では%i
識別子で参照できる。(man systemd.unit
を参照)
単純に考えると以下のように記述すれば良さそうだが、コマンド名の部分で%i
は展開されないため、このままでは実行できない。
ExecStart=/home/%i/bin/dropbox.py start
そこで、以下のようにbashから起動し、かつ、sudo
コマンドで実行ユーザを指定すればうまく展開させることができる。
ExecStart=/bin/bash -c "sudo -u '%i' /home/%i/bin/dropbox.py start"