プログラムを実行するには、systemdサービスを介してシェルスクリプトに接続します。

プログラムを実行するには、systemdサービスを介してシェルスクリプトに接続します。

特定の時間にプログラム(obs)を実行し、そのためにシェルスクリプトを指すシステムサービスファイルを作成してから、タイマーでファイルを実行したいと思います。

ファイルを実行しましたが、スクリプトが実行されました。しかし、何らかの理由で実行されていません。

サービスファイル:

[Unit]
Description=Starting Yoga recording on OBS

[Service]
ExecStart=/usr/local/bin/script.sh

script.sh:

#!/bin/bash

echo "yo working" >> /home/user/1.txt

/usr/bin/obs --minimize-to-tray --startrecording

echo "or is it?" >> /home/user/2.txt

文字列はテキストファイルに書き込まれ、script.sh端末を介して実行されると機能し、サービスファイルに問題があると確信しています。

しかし、役立つ場合はArchディストリビューションを使用しています。

答え1

OBSはGUIアプリケーションのようです。 systemdスクリプトの実行はうまく機能しますが、GUIアプリケーションにはわずかな技能が必要です。

まず、--userバスに乗ってください。これは、OBSが次のように実行されることを意味します。あなた、ルートではありません。明らかなセキュリティ上の利点に加えて、ユーザーバスで実行すると、サービスが使用$DISPLAYしている環境や場所を含むユーザー環境を継承できます$XAUTHORITY。これは、bashを実行すると、.bashrcシステムバスでは発生しない個人データがロードされることを意味します。これを行うには、そのsystemd単位をからに/etc/systemd/system/移動します~/.config/systemd/user/

特定の時間にプログラム(obs)を実行したい

これにはsystemdタイマーを使用してください。

#~/.config/systemd/user/obs.timer
[Unit]
Description=Timer for OBS

[Timer]
# Run obs.service every 2 hours
OnCalendar=*-*-* 00,02,04,06,08,10,12,14,16,18,20,22:00:00

[Install]
WantedBy=timers.target

obs.service2時間ごとにトリガーされます。その後、変更せずobs.serviceにそのままにすることができます。

# ~/.config/systemd/user/obs.service
[Unit]
Description=Starting Yoga recording on OBS

[Service]
ExecStart=/usr/local/bin/script.sh

起動時に起動するには:

$ systemctl --user enable obs.timer
$ systemctl --user start obs.timer

タイマーはサービスをトリガーするため、サービスを明示的に開始またはアクティブ化する必要はありません。

サービスをすぐに実行するには、いつでも直接起動できます。

$ systemctl --user start obs.service

関連情報