У меня есть сценарий, который должен запускаться с привилегиями root, а также должен использовать display (opencv imshow in it.) Как мне запустить этот сценарий при перезагрузке?
Я пробовал использовать файл my.sh:
export DISPLAY=:0
/usr/bin/python3 /path/to/myscript.py
cronjob:
@reboot /bin/bash /path/to/my.sh
Тем не менее не запускается.
Не могли бы вы мне помочь?
Вы не можете запустить задание, которое выполняется @reboot
с графическим дисплеем, потому что в момент загрузки системы графический дисплей еще не запущен.
Вам следует добавить этот скрипт в "Startup programs" вашего сеанса рабочего стола. Что касается запуска от имени root, то наиболее надежным методом запуска скрипта от имени root для меня является использование двоичной обертки с правами setuid root.
Напишите следующую короткую программу на C (назовите ее wrapper.c
, например):
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
int main()
{
int rc;
setuid( 0 );
rc=WEXITSTATUS(system( "/path/to/your/script" ));
exit(rc);
}
Скомпилируйте программу, используя: gcc -o wrapper wrapper.c
(для этого у вас должен быть установлен пакет build-essential
).
Сделайте файл wrapper
setuid root: sudo chown root:root wrapper
, затем sudo chmod o+s wrapper
Затем пропишите путь к файлу wrapper
в стартовых программах вашей сессии рабочего стола.