特定の時間にプログラム(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.service
2時間ごとにトリガーされます。その後、変更せず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