noellabo's tech blog

@noellaboの技術ブログ

mastodonユーザーでsystemctl restart mastodon-*したいよね?

小ネタ。アップデートの際など、mastodonユーザーで作業中にユーザーを切り替えてsystemctl restart mastodon-*するのは面倒なので、mastodonユーザーが実行できる専用のコマンドmastodon_ctlを作って再起動できるようにします。

準備

シェルスクリプトmastodon_ctlを作成する

以下の内容のファイルをmastodon_ctlという名前で保存して、/usr/local/binに移動しておきます。

#!/bin/bash

declare -A TARGETS=(
  ["web"]="mastodon-web.service"
  ["sidekiq"]="mastodon-sidekiq.service"
  ["streaming"]="mastodon-streaming.service"
)
declare -A targets

cmd="$1"
params=(${@:2:$#})

if [[ ${#params[@]} -eq 0 ]]; then
  params+=("web" "sidekiq" "streaming")
fi

for param in ${params[@]}
do
  if [[ "${TARGETS[${param}]+_}" == "_" ]]; then
    targets[${param}]="${TARGETS[${param}]-_}"
  else
    echo "Invalid target."
    echo "Please list one or more:(${!TARGETS[@]})"
    exit
  fi
done

case $cmd in
  "start")
     systemctl start "${targets[@]}"
     ;;
  "stop")
     systemctl stop "${targets[@]}"
     ;;
  "restart")
     systemctl restart "${targets[@]}"
     ;;
  "status")
     systemctl status "${targets[@]}"
     ;;
  *)
    echo "Usage: mastodon_ctl start|stop|restart|status [web] [sidekiq] [streaming]"
    ;;
esac

間違ってroot以外で実行してもエラーになって誰も嬉しくないので、 所有者をrootに、実行権限を所有者にだけ付けておきましょう。

chown root:root /usr/local/bin/mastodon_ctl
chmod 744 /usr/local/bin/mastodon_ctl

mastodonユーザーにsudo mastodon_ctlを許可する

visudo/etc/sudoersを編集します。

以下の記述を追加。

mastodon ALL=NOPASSWD: /usr/local/bin/mastodon_ctl

mastodonユーザーに、パスワード無しで、/usr/local/bin/mastodon_ctlの実行を許可する、という設定です。

このように、sudoは、何でもできる権限を与える代わりに、特定のユーザーに特定のコマンドだけを許可することが可能ですので覚えておきましょう。

使い方

mastodonユーザーで作業している時に、mastodon_ctlコマンドが使えるようになっています。

Mastodonのプロセスを一括で再起動したい時は、下記のように呼び出します。

sudo mastodon_ctl restart

mastodon-web.service(WebUIやAPIを受け持っているpuma)だけ再起動したい場合は、webと指定します。

sudo mastodon_ctl restart web

動作には、start, stop, restart, status を指定できます。 対象には、web, sidekiq, streaming を指定できます。省略すると3つ全てが対象になります。

よっしゃ、これでユーザー切り替えずに簡単に再起動できるようになったぞ! うん、まぁ、便利かな……。

(何度も実行する反復作業を簡単にするためなら手間暇かけちゃうヤツ、プログラマの三大美徳「怠惰」であります)

bashのブレース展開を便利に使う

小ネタついでに。

mastodon-*の代わりにmastodon-{web,sidekiq,streaming}を使う

systemctlmastodon-*って指定した時に、mastodon-web、mastodon-sidekiq、mastodon-streamingをいっぺんに対象にできるの便利なんですが、これが出来るのってそれぞれが動いている時だけなので、systemctl start mastodon-*ってやっても動かないんですよね、まだどれも実行されてないので。仕組みがよくわかってないと、なんで動かないんだろうってハマるところです。

なので、ブレース展開を使いましょう。

ブレースというのは囲むのに使っている{}の波括弧のことね。

カンマ区切りで並べると、それぞれ展開されます。 mastodon-{web,sidekiq,streaming}と書くと、mastodon-web mastodon-sidekiq mastodon-streamingと書いたのと同じになります。

深いディレクトリにあるファイルの名前を変える

例えば/home/mastodon/live/にある.env.production.sample.env.productionに変更するのに、普通はこう書くじゃないですか。

sudo mv /home/mastodon/live/.env.production.sample /home/mastodon/live/.env.production

ちょこっと変更するだけなのに何度もディレクトリ名を指定するのは激しく面倒くさいので、こうします。

sudo mv /home/mastodon/live/.env.production{.sample,}

ブレース展開で、違うところだけ指定するワケです。 .sampleと空文字を並べて、.sampleを除去しちゃう。