Как запустить скрипт при входе / выходе из Unity?

8

У меня есть два сценария - один для монтирования некоторых папок через SSHFS - и один для размонтирования.

Я хотел бы запустить сценарий монтирования, когда мой рабочий стол Ubuntu по умолчанию запущен (после того, как я войду в систему с графической консоли), - и сценарий размонтирования, когда я "Выйти ..." с колесика шестерни в правом верхнем углу рабочий стол.

Пожалуйста, может кто-нибудь сказать мне, как этого добиться? Каковы наиболее удобные / стандартные зацепки для запуска команд при запуске / выходе с рабочего стола?

aSteve
источник
Я не ожидаю, что время будет критическим. Важно то, что первый скрипт выполняется за секунду или около того ... до того, как пользователь в интерактивном режиме запускает приложения. При выходе из системы просто имеет значение, что второй скрипт выполняется до того, как кто-то еще войдет в консоль.
aSteve
У меня есть root-доступ. Установка пакетов не проблема. Если возможно, я бы хотел использовать только привилегии на уровне пользователя - при условии, что есть удобный способ сделать это. Мои скрипты не нуждаются в руте. Я ищу совет о том, как лучше всего запускать мои сценарии при запуске / остановке Unity ... Большая часть моего опыта работы с Linux / Unix не связана с GUI. Со старой школой XWindows и ванильным оконным менеджером я мог бы сделать это из .xinitrc. Как лучше всего использовать современный рабочий стол Unity по умолчанию?
aSteve
Я не хочу, чтобы действие выхода из системы зависело от того, что подключено / не смонтировано ... Все это динамически обрабатывается существующими сценариями. Что мне нужно, это аккуратный способ выполнить первый скрипт при входе в систему и второй при выходе из системы для сеанса графического интерфейса на консоли. Я нашел «Startup Applications» - но это решило бы только первую половину проблемы.
aSteve
Я не думаю, что «приложения входа в систему» ​​- правильная стратегия для любого сценария. У меня есть два скрипта ... один настраивает вещи для моего сеанса GUI; другой убирает после сеанса GUI. Оба должны быть запущены от имени того же пользователя, что и сеанс GUI. Ни один не требует никаких аргументов. Мне нужно найти подходящий способ запуска скриптов - в нужное время, вот и все. Никаких предположений о том, что на самом деле делают сценарии, быть не должно. Вопрос в том, как перехватить события, совпадающие с входом и выходом из Unity.
'17

Ответы:

9

Учитывая ваше требование запуска задания при входе в Unity, а не для других входов в систему, задание сеанса Upstart кажется идеальным.

Вы, возможно, заметили это: процессы, которые вы запускаете после входа в GUI, находятся под вторым initпроцессом. Это initправильная инициализация Upstart, и вы можете запускать и останавливать сеансовые задания на основе событий, которые она генерирует. Никаких корневых привилегий не требуется вообще. Еще лучше (или хуже в зависимости от перспективы), это еще не полностью поддерживается для безголовых систем. Вход в SSH не запустил пользователя init из быстрого теста, который я только что сделал.

Чтобы создать сессионное задание, создайте новый .confфайл в ~/.config/upstart. Это основной каталог по умолчанию для заданий сеанса Upstart ( $XDG_CONFIG_HOME/upstart), создайте его, если он не существует. Вот пример работы:

tee ~/.config/upstart/myjob.conf <<EOF
description "My job"
start on desktop-start
stop on desktop-end

script 
       firefox 'http://upstart.ubuntu.com/cookbook/#session-job'
end script
EOF

Вы можете вручную контролировать это:

start myjob 
# or
initctl start myjob

Команда serviceиспользуется для управления системными заданиями (теми, что в /etc/init.dили /etc/init). Для управления сессионными заданиями необходимо использовать initctlкоманду, которая используется для взаимодействия с Upstart.

Смотрите man upstart-eventsбольше событий, которые вы можете использовать.

Мур
источник
Я не заметил ... но ... я согласен - выскочка сессия выглядит отлично. Я, вероятно, упускаю что-то очевидное ... но создав ~ / .config / upstart / myjob.conf (как указано выше), когда я выполняю "service myjob start", я получаю "myjob: unrecognized service" Есть идеи?
aSteve
Решено: мне нужно было использовать «start myjob» вместо «service myjob start». Другой полезной командой был «список initctl»
aSteve
@aSteve сожалею об этом. Я исправил это,
Муру
Нет проблем. Подход upstart / сессий определенно выглядит правильно. Тем не менее, я еще не определил лучший способ использовать его для выполнения отдельных (недолговечных) сценариев запуска и остановки. Могу ли я использовать только 1 файл .conf или мне нужно 2? Должно ли это быть "услуга" или "задача"? Должен ли я использовать до / после запуска и до / после остановки? Мне не нужно / не нужно, чтобы процесс запускался между запуском и остановкой ... если, я думаю, нет простого способа поместить значок на панель инструментов ... хотя это, вероятно, излишне - для моих целей.
aSteve
1
В заключение. После долгих взломов ... Я обнаружил, что мне нужно запускать myendtask "в конце сеанса", а не "в конце рабочего стола". Это несколько нелогично, но работает. (Наконец -то !)
aSteve
1

Решением было использование выскочки задач. Мне потребовалось две задачи - одна запускалась при инициализации рабочего стола для пользователя; второй, когда истекает сеанс пользователей. Следующие два скрипта работают для меня под Ubuntu 14.04.

В ~ / .config / upstart / desktopOpen.conf

description "Desktop Open Task"
start on desktop-start
task
script
# Commands to mount sshfs go here as shell-script.
end script

В ~ / .config / upstart / desktopClose.conf

description "Desktop Close Task"
start on session-end
task
script
# Commands to unmount sshfs go here as shell-script.
end script

Мои пальцы скрещены, что эти события будут продолжать соответствовать требованиям в будущих выпусках Ubuntu. Я подумал, что стоит опубликовать свое решение здесь - на случай, если оно пригодится другим.

aSteve
источник
-1

Вот несколько советов по запуску скрипта после входа в систему:

Сценарий StackOverflow для Linux после загрузки : Cliff notes должен поместить ваш * .sh файл в /etc/profile.d.

Если вы хотите запускать скрипты при загрузке, вот несколько советов для этого:

Сценарий StackOverflow для Linux после загрузки : Примечания к скале должны использовать /etc/rc.local или crontab.

Хиггс
источник
1
Ни один из этих вариантов не выглядит «правильным». Я только хочу выполнить скрипт, когда я вхожу / выключаюсь в смысле начала / завершения сеанса единства. Я не хочу запускать свои скрипты каждый раз, когда появляется новый вход в систему. Новые входы в систему могут инициироваться удаленно через ssh и т. Д., Но я не хочу, чтобы они выполняли сценарий, поскольку они не инициируют новый сеанс Unity (на консоли).
aSteve