Flatpakが実行される前に、Flatpakが使用するコンテナが実行されるようにインストールされているFlatpakの実行方法を変更したいと思いますpodman
(Flatpakの実行が完了したら終了することをお勧めしますが、これはオプションです)。これの目的は、リソースを節約することです。podman
コンテナが常に実行される必要はありません。
explainshell
たとえば、VSCodeの起動時にコンテナを起動したいとします。
コマンドラインでFlatpaksを実行する場合を扱うのは簡単です。スクリプトalias
flatpak
を使用flatpak-wrapper
し、そのflatpak-wrapper
スクリプト内でflatpak run
関心のある呼び出しを傍受し、podman run
必要に応じてコマンドを実行してから元の要求flatpak run
コマンドを実行します。
ただし、flatpakを介してインストールされたファイルには、シェルエイリアスの影響を受けないハードコーディングされた.desktop
呼び出しが含まれているため、よりトリッキーです。 KDE UIを使用してこれらのファイルを1つずつ簡単に編集/usr/bin/flatpak
できますが、この編集内容をスクリプトとして作成するにはどうすればよいですか?.desktop
私が必要なのは、次のようなものだと思います。
.desktop
bashスクリプトを使用して編集できるように、特定のFlatpak用にインストールされているファイルを見つける方法.desktop
Flatpakのアップグレードによってファイルが変更された後でも、ユーザー.desktop
の手動ステップなしでそのファイルの編集内容をそのまま残すことができます。
(Podmanコンテナがサポートしていないため、ソケットアクティベーションが利用できないとします。)
答え1
私のdbusセッションバスを少し監視した結果、vscodium Flatpakコンテナに関連する多くのトラフィックが明らかになりました。しかし、インターネット検索の後にsystemdが実行されている場合 - それが私に役立つことを知りました -どのFlatpakコンテナは起動時にsystemdにメッセージを送信します。システム構成ファイルの使用必要な自動起動動作を設定します。
これが私がすることです。このソリューションは、systemd構成ファイルを生成する2つの可能な方法を示しています。
- 単純なファイルまたは
- ディレクトリ内のファイル
.d
- 他のスクリプトと競合しない一意のファイル名を使用できるため、スクリプトの生成に適しています。
[greenrd@fedora ~]$ mkdir .config/systemd/user
.service
Podmanコンテナのsystemdファイルを生成します。 Upholdは後で再起動する必要があるため、再起動ポリシーを「いいえ」に設定しました。
tee
コマンドプロンプトでこれを手動で実行するため、インストール前に確認できるようにこの方法を使用しています。スクリプトではこれは必要ありません。
[greenrd@fedora ~]$ podman generate systemd --restart-policy=no explainshell |tee es.service
WARN[0000] Container 2f9dd483eed9f6a5705dc142e65c55103c25f8884aa51e3b0e400686f8640b31 has restart policy "always" which can lead to issues on shutdown: consider recreating the container without a restart policy and use systemd's restart mechanism instead
# container-2f9dd483eed9f6a5705dc142e65c55103c25f8884aa51e3b0e400686f8640b31.service
# autogenerated by Podman 4.5.1
# Fri Jun 16 21:19:03 BST 2023
[Unit]
Description=Podman container-2f9dd483eed9f6a5705dc142e65c55103c25f8884aa51e3b0e400686f8640b31.service
Documentation=man:podman-generate-systemd(1)
Wants=network-online.target
After=network-online.target
RequiresMountsFor=/run/user/1000/containers
[Service]
Environment=PODMAN_SYSTEMD_UNIT=%n
Restart=no
TimeoutStopSec=70
ExecStart=/usr/bin/podman start 2f9dd483eed9f6a5705dc142e65c55103c25f8884aa51e3b0e400686f8640b31
ExecStop=/usr/bin/podman stop \
-t 10 2f9dd483eed9f6a5705dc142e65c55103c25f8884aa51e3b0e400686f8640b31
ExecStopPost=/usr/bin/podman stop \
-t 10 2f9dd483eed9f6a5705dc142e65c55103c25f8884aa51e3b0e400686f8640b31
PIDFile=/run/user/1000/containers/overlay-containers/2f9dd483eed9f6a5705dc142e65c55103c25f8884aa51e3b0e400686f8640b31/userdata/conmon.pid
Type=forking
[Install]
WantedBy=default.target
起動時に自動的に開始される動作を削除してみましょう。
[greenrd@fedora ~]$ sed -i -e '/WantedBy=default\.target/d' es.service
Upholds
次の問題を処理する必要があるため、再起動設定を削除してください。
[greenrd@fedora ~]$ sed -i -e '/Restart=/d' es.service
よさそうですね。インストールしてみましょう。
[greenrd@fedora ~]$ mv es.service .config/systemd/user/explainshell.service
依存関係を追加します。範囲を使って見つけました。忙しい:
[greenrd@fedora ~]$ cat <<EOF >.config/systemd/user/app-com.vscodium.codium-.scope.d/my-ublue.conf
> [Unit]
Upholds=explainshell.service
> EOF
最後に、新しい設定ファイルについてsystemdに通知します。
[greenrd@fedora ~]$ systemctl --user daemon-reload
いいですね。動作しますが、vscodiumが終了した後もコンテナはまだ存在します。
[greenrd@fedora ~]$ podman ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9b733a307e42 quay.io/fedora/fedora:38 -v --name greenrd... 2 days ago Up 2 days fedora
ef21c84a47eb ghcr.io/ublue-os/boxkit:latest -v --name greenrd... 2 days ago Up 2 days boxkit
2f9dd483eed9 ghcr.io/idank/idank/explainshell:master make serve 45 hours ago Up About a minute 0.0.0.0:5000->5000/tcp explainshell
実際、vscodiumはまだ完全に死んでいません。いくつかのゾンビプロセスと他のいくつかのプロセスはまだ生きています。奇妙な。それらを殺そう:
[greenrd@fedora ~]$ killall codium
[greenrd@fedora ~]$ killall codium
[greenrd@fedora ~]$ killall -KILL codium
codium: no process found
ただし、explainshellコンテナはまだ存在します。
[greenrd@fedora ~]$ podman ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9b733a307e42 quay.io/fedora/fedora:38 -v --name greenrd... 2 days ago Up 2 days fedora
ef21c84a47eb ghcr.io/ublue-os/boxkit:latest -v --name greenrd... 2 days ago Up 2 days boxkit
2f9dd483eed9 ghcr.io/idank/idank/explainshell:master make serve 45 hours ago Up 3 minutes 0.0.0.0:5000->5000/tcp explainshell
この問題を解決するために追加しようとしました。
After=explainshell.service
PropagatesStopTo=explainshell.service
到着するmy-ublue.conf
。しかし、残念ながら、Flatpakによって生成された初期範囲は一時的であるため、停止し、すぐにexplainshellコンテナも停止します。したがって、コンテナを自動的に終了することはできませんが、これはオプションの要件です。