Я написал простой скрипт, который запускается при выключении компьютера. Я поместил скрипт в каталог /etc/init.d/ и связал его с /etc/rc0.d/ . Ссылка является мягкой ссылкой и называется K99checkout-reminder .

Вот результат из списка файлов в /etc/rc0.d/:

lrwxrwxrwx 1 root root 24 Nov 17 18:10 K99checkout-reminder -> ../init.d/alert_checkout

Вот содержание alert_checkout:

#!/bin/bash
export DISPLAY=:0.0
if zenity --question --text="I guess you have a nice working day?"; then
    zenity --info --text="Gr8! Now please
          _______

               |
               |
               |
               v

DO NOT forget to CHECKOUT your working time at door.\n\nSee you next day!"
else
    zenity --info --text="Thats really sad.\n\nGo checkout your time to finish your working.\n\nHave good dinner, go sleep early and have a nice day!"
fi

Я попытался запустить скрипт с правами root и он работает нормально:

$ /etc/rc0.d $ sudo ./K99checkout-reminder

Получил окно предупреждения появилось!

Есть ли что-то, что я здесь скучаю?

Спасибо.

4 ответа4

0

Я думаю, что ссылка, которую вы показываете, является символической ссылкой или символической ссылкой.

Когда система выключается, я думаю, что она запускает компоненты Kill в числовом порядке, так что

K01 ... запускается до k02 ...

Если вы запускаете этот скрипт как K99 ...

Тогда не будет ли оконный менеджер уже закрыт?

Вы пробовали запустить свой скрипт как:

K01checkout-reminder 
0

Попробуйте сменить владельца, может быть, если он после этого будет работать с разрешениями. Разрешения могут быть хитрыми, даже если иногда предоставляется полный доступ.

0

попробуйте добавить \ символ перед окончанием строки в тексте zenity, например так:

#!/bin/bash
export DISPLAY=:0.0
if zenity --question --text="I guess you have a nice working day?"; then
zenity --info --text="Gr8! Now please \
      _______\
\
               |\
               |\
               |\
               v\
\
DO NOT forget to CHECKOUT your working time at door.\n\nSee you next day!";
else
zenity --info --text="Thats really sad.\n\nGo checkout your time to finish your         working.\n\nHave good dinner, go sleep early and have a nice day!"
fi

или замените символы новой строки на \n escape.

0

Обратите внимание, что есть разница между выполнением с правами root и выполнением с правами пользователя root. Если вы попытались запустить его так:

sudo ./alert_checkout

затем это сработало, потому что реальный UID все еще был установлен для вашего пользователя, и только эффективный UID был изменен на root. Однако при запуске в качестве сценария init.d он выполняется от имени пользователя root, поэтому оба UID имеют значение root.

Это сбивает с толку для zenity поскольку он должен отображать сообщение внутри вашего пользователя sesssion. Поэтому ему нужен реальный идентификатор, соответствующий вашему пользователю.

Если вам это нужно только для работы с определенной учетной записью пользователя, просто отредактируйте скрипт и запустите zenity в su <user> -c <zenity cmd> .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .