Bash スクリプトは、Crontab で実行すると異なる動作をします。編集 - Pulseaudioの環境変数の問題

Bash スクリプトは、Crontab で実行すると異なる動作をします。編集 - Pulseaudioの環境変数の問題

Cronは両方のコマンドを完全に無視しますが、手動で完全に機能するスクリプトがあります(これは単なるスニペットです)。

sinkint=$(pacmd list-sinks | sed -n '/index\W [1-9]/p' | sed 's/.*://g;s/\W//g')

pacmd set-default sink $sinkint
pacmd set-sink-volume $sinkint 20%

予約されたこと

* * * * * /path/to/script arg1 >> /path/to/log

エラーメッセージ

No PulseAudio daemon running, or not running as session daemon.
No PulseAudio daemon running, or not running as session daemon.
You have to specify a sink name/index and a volume

編集する:

スクリプトで変数を試しました。

export PULSE_SERVER=unix:/tmp/pulse-socket
export PULSE_COOKIE=/tmp/pa_cookie

私の/etc/pulse/default.paのソケット

load-module module-native-protocol-unix socket=/tmp/pulse-socket

私の/etc/pulse/client.confのソケットとCookie

default-server = unix:/tmp/pulse-socket
cookie-file = /tmp/pa_cookie

クローンタップ-e

PULSE_SERVER=unix:/tmp/pulse-socket
PULSE_COOKIE=/tmp/pa_cookie

* * * * * /path/to/script arg1 2> /path/to/log

答え1

XDG_RUNTIME_DIR=/run/user/1000crontabに追加すると動作します!

とても迷惑なことです。これは、文字通り私が必要とする唯一の環境変数だからです。まあ、将来的に誰かが答えが必要な場合 - これが答えだと思います。

答え2

ジョブがによって実行されているcronか、systemd起動スクリプトがデスクトップで実行されているのと同じランタイム環境で実行されていません。systemdでスクリプトを起動しますroot。変更やその他の環境変数の設定は、ジョブに自動的に伝播されPATHません。たとえば、noなので、GUIプログラムには特別な処理(読み取り)が必要です。~/.bashrccron$DISPLAYman xhost

cron環境変数は、すべてのジョブの読み取りファイルで設定できます。crontabman 5 crontab

echo "=== id ===";id;echo "=== set ===";set;echo "=== env ===";env | sort;echo "=== alias ===";alias各環境の結果を確認してください。

その行はデフォルトで解釈されるため、構文はcommandそれよりも単純なので、環境を設定した後に必要なプログラムを呼び出すスクリプト(実行可能、インストール、開始)を呼び出すことをお勧めします。crontab/bin/sh/bin/bashcommandbash#!/bin/bash

関連情報