Узнайте больше о новой видеокарте и наслаждайтесь ею: BinaryDriverHowto / Nvidia
Чтобы выполнить любое приложение GUI из Cron, вы должны экспортировать несколько переменных окружения рабочего стола. В большинстве случаев достаточно экспортировать текущее значение $DISPLAY. Я предлагаю вам создать дополнительный скрипт запуска (bash), который запустит ваше приложение.
В этом ответе предоставляется надежный подход, как найти и экспортировать значение $DISPLAY текущего пользователя. Но есть проблема. Пока пользователь не зарегистрирован в DE, значение $DISPLAY не установлено. Sо мы могли бы добавить дополнительное условие, как это сделано в этих ответах:
# Get the value of the $DISPLAY variable for the current user. Unset it just in case this is a `ssh -X` connection
unset DISPLAY;
while [ "$DISPLAY" == "" ]; do
export DISPLAY=$(w "$USER" | awk 'NF > 7 && $2 ~ /tty[0-9]+/ {print $3; exit}' 2>/dev/null) && sleep 3
done
Это условие работает во всех других случаях, но оно не выполняется в @reboot заданиях Cron, и я не могу понять причина. Итак, в приведенном ниже сценарии используется другой подход, чтобы проверить, зарегистрирован ли пользователь в Mate. Некоторым приложениям нужны и еще несколько переменных (например, см. этот ответ , и это отвечает) как $DBUS_SESSION_BUS_ADDRESS и $DESKTOP_SESSION. На мой взгляд, наилучшим подходом является , это ответы в каталоге /proc (псевдо-файловая система процесса) и экспортировать все переменные из файла environ, который находится внутри /proc/process-number.
Я создал небольшой проект, названный этим , посвященным этому. Он работает, но не проверен для всех случаев пользователя (например, текущий). Здесь я извлек существенную часть, относящуюся к Mate DE, и сделал упомянутую выше модификацию.
1. Создайте исполняемый файл с этим контентом:
#!/bin/bash -e
# Check whether the user is logged in Mate
while [ -z "$(pgrep mate-session -n -U $UID)" ]; do
sleep 3 && count=$((count+1)) && echo "$count" > /tmp/mate-cron.log
done
# Get the content of the Current-Desktop-Session Environment File as an array:
EnvVarList=`cat -e "/proc/$(pgrep mate-session -n -U $UID)/environ" | sed 's/\^@/\n/g'`
# Export the Current-Desktop-Session Environment Variables:
for EnvVar in $EnvVarList; do
echo "$EnvVar" >> /tmp/mate-cron.log
export "$EnvVar"
done
# Execute the list of the input commands
nohup "${1}" >/dev/null 2>&1 &
exit 0
Это условие работает во всех других случаях, но оно не срабатывает в @reboot заданиях Cron, и я не могу понять причину. Итак, в приведенном ниже сценарии используется другой подход, чтобы проверить, зарегистрирован ли пользователь в Mate. 1. Теперь в crontab используйте: [!d20 ]
@reboot /path-to-the/script "your-application"
3. Примечания:
Этот скрипт не работает с root crontab. Из-за переменных $UID и $USER. Вы можете заменить их с UID определенного пользователя и NAME. Для других DE изменений mate-session из этой части $(pgrep mate-session -n -U $UID) с именем процесса другого DE, например gnome-session. Возможно, для графических приложений, которые выполняются при запуске системы, лучше создать запись в Startup Applications. Для Mate DE: Control Centre > Personal > Startup Applications (источник).3. Здесь показано, как работает скрипт:
Чтобы выполнить любое приложение GUI из Cron, вы должны экспортировать несколько переменных окружения рабочего стола. В большинстве случаев достаточно экспортировать текущее значение $DISPLAY. Я предлагаю вам создать дополнительный скрипт запуска (bash), который запустит ваше приложение.
В этом ответе предоставляется надежный подход, как найти и экспортировать значение $DISPLAY текущего пользователя. Но есть проблема. Пока пользователь не зарегистрирован в DE, значение $DISPLAY не установлено. Sо мы могли бы добавить дополнительное условие, как это сделано в этих ответах:
# Get the value of the $DISPLAY variable for the current user. Unset it just in case this is a `ssh -X` connection
unset DISPLAY;
while [ "$DISPLAY" == "" ]; do
export DISPLAY=$(w "$USER" | awk 'NF > 7 && $2 ~ /tty[0-9]+/ {print $3; exit}' 2>/dev/null) && sleep 3
done
Это условие работает во всех других случаях, но оно не выполняется в @reboot заданиях Cron, и я не могу понять причина. Итак, в приведенном ниже сценарии используется другой подход, чтобы проверить, зарегистрирован ли пользователь в Mate. Некоторым приложениям нужны и еще несколько переменных (например, см. этот ответ , и это отвечает) как $DBUS_SESSION_BUS_ADDRESS и $DESKTOP_SESSION. На мой взгляд, наилучшим подходом является , это ответы в каталоге /proc (псевдо-файловая система процесса) и экспортировать все переменные из файла environ, который находится внутри /proc/process-number.
Я создал небольшой проект, названный этим , посвященным этому. Он работает, но не проверен для всех случаев пользователя (например, текущий). Здесь я извлек существенную часть, относящуюся к Mate DE, и сделал упомянутую выше модификацию.
1. Создайте исполняемый файл с этим контентом:
#!/bin/bash -e
# Check whether the user is logged in Mate
while [ -z "$(pgrep mate-session -n -U $UID)" ]; do
sleep 3 && count=$((count+1)) && echo "$count" > /tmp/mate-cron.log
done
# Get the content of the Current-Desktop-Session Environment File as an array:
EnvVarList=`cat -e "/proc/$(pgrep mate-session -n -U $UID)/environ" | sed 's/\^@/\n/g'`
# Export the Current-Desktop-Session Environment Variables:
for EnvVar in $EnvVarList; do
echo "$EnvVar" >> /tmp/mate-cron.log
export "$EnvVar"
done
# Execute the list of the input commands
nohup "${1}" >/dev/null 2>&1 &
exit 0
Это условие работает во всех других случаях, но оно не срабатывает в @reboot заданиях Cron, и я не могу понять причину. Итак, в приведенном ниже сценарии используется другой подход, чтобы проверить, зарегистрирован ли пользователь в Mate. 1. Теперь в crontab используйте:
@reboot /path-to-the/script "your-application"
3. Примечания:
Этот скрипт не работает с root crontab. Из-за переменных $UID и $USER. Вы можете заменить их с UID определенного пользователя и NAME. Для других DE изменений mate-session из этой части $(pgrep mate-session -n -U $UID) с именем процесса другого DE, например gnome-session. Возможно, для графических приложений, которые выполняются при запуске системы, лучше создать запись в Startup Applications. Для Mate DE: Control Centre > Personal > Startup Applications (источник).3. Здесь показано, как работает скрипт:
Чтобы выполнить любое приложение GUI из Cron, вы должны экспортировать несколько переменных окружения рабочего стола. В большинстве случаев достаточно экспортировать текущее значение $DISPLAY. Я предлагаю вам создать дополнительный скрипт запуска (bash), который запустит ваше приложение.
В этом ответе предоставляется надежный подход, как найти и экспортировать значение $DISPLAY текущего пользователя. Но есть проблема. Пока пользователь не зарегистрирован в DE, значение $DISPLAY не установлено. Sо мы могли бы добавить дополнительное условие, как это сделано в этих ответах:
# Get the value of the $DISPLAY variable for the current user. Unset it just in case this is a `ssh -X` connection
unset DISPLAY;
while [ "$DISPLAY" == "" ]; do
export DISPLAY=$(w "$USER" | awk 'NF > 7 && $2 ~ /tty[0-9]+/ {print $3; exit}' 2>/dev/null) && sleep 3
done
Это условие работает во всех других случаях, но оно не выполняется в @reboot заданиях Cron, и я не могу понять причина. Итак, в приведенном ниже сценарии используется другой подход, чтобы проверить, зарегистрирован ли пользователь в Mate. Некоторым приложениям нужны и еще несколько переменных (например, см. этот ответ , и это отвечает) как $DBUS_SESSION_BUS_ADDRESS и $DESKTOP_SESSION. На мой взгляд, наилучшим подходом является , это ответы в каталоге /proc (псевдо-файловая система процесса) и экспортировать все переменные из файла environ, который находится внутри /proc/process-number.
Я создал небольшой проект, названный этим , посвященным этому. Он работает, но не проверен для всех случаев пользователя (например, текущий). Здесь я извлек существенную часть, относящуюся к Mate DE, и сделал упомянутую выше модификацию.
1. Создайте исполняемый файл с этим контентом:
#!/bin/bash -e
# Check whether the user is logged in Mate
while [ -z "$(pgrep mate-session -n -U $UID)" ]; do
sleep 3 && count=$((count+1)) && echo "$count" > /tmp/mate-cron.log
done
# Get the content of the Current-Desktop-Session Environment File as an array:
EnvVarList=`cat -e "/proc/$(pgrep mate-session -n -U $UID)/environ" | sed 's/\^@/\n/g'`
# Export the Current-Desktop-Session Environment Variables:
for EnvVar in $EnvVarList; do
echo "$EnvVar" >> /tmp/mate-cron.log
export "$EnvVar"
done
# Execute the list of the input commands
nohup "${1}" >/dev/null 2>&1 &
exit 0
Это условие работает во всех других случаях, но оно не срабатывает в @reboot заданиях Cron, и я не могу понять причину. Итак, в приведенном ниже сценарии используется другой подход, чтобы проверить, зарегистрирован ли пользователь в Mate. 1. Теперь в crontab используйте:
@reboot /path-to-the/script "your-application"
3. Примечания:
Этот скрипт не работает с root crontab. Из-за переменных $UID и $USER. Вы можете заменить их с UID определенного пользователя и NAME. Для других DE изменений mate-session из этой части $(pgrep mate-session -n -U $UID) с именем процесса другого DE, например gnome-session. Возможно, для графических приложений, которые выполняются при запуске системы, лучше создать запись в Startup Applications. Для Mate DE: Control Centre > Personal > Startup Applications (источник).3. Здесь показано, как работает скрипт: