Як запустити сценарій для входу / виходу Unity?


8

У мене є два сценарії - один для встановлення деяких папок на SSHFS - і один для відключення.

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

Скажіть, будь ласка, хтось мені, як цього досягти? Які найбільш зручні / стандартні гачки для запуску команд при запуску / виході з робочого столу?


Я не очікую, що термін буде критичним. Важливо те, що перший сценарій виконується протягом другого або близько того ... перед тим, як користувач інтерактивно запускає програми. Під час виходу просто важливо, що другий скрипт виконується до того, як хтось інший ввійде на консоль.
aSteve

У мене є кореневий доступ. Встановлення пакетів не є проблемою. Якщо можливо, я хотів би використовувати лише привілеї на рівні користувача - якщо припустити, що це є акуратним способом. Мої сценарії не потребують root. Я шукаю поради щодо того, як найкраще ініціювати мої сценарії при запуску / зупинці Unity ... Більшість мого досвіду Linux / Unix знаходиться в контексті не GUI. Зі старими шкільними XWindows та менеджером вікон ванілі я міг би це зробити з .xinitrc. Який найкращий спосіб на сучасному робочому столі Unity?
aSteve

Я не хочу робити дії відходу залежними від того, що є / не встановлено ... Це все динамічно обробляється існуючими сценаріями. Мені потрібно акуратний спосіб виконання першого скрипту при вході в систему, а другого - при відключенні для сеансу GUI на консолі. Я знайшов "Запуск програм" - але це вирішило б лише першу половину проблеми.
aSteve

Я не думаю, що "програми для входу" - це правильна стратегія для будь-якого сценарію. У мене є два сценарії ... один встановлює речі для мого сеансу GUI; інший очищається після сеансу GUI. Обидва повинні працювати як той самий користувач, що і сеанс GUI. Ніяких аргументів не потрібно. Мені потрібно знайти відповідний спосіб запуску сценаріїв - у потрібний час, ось і все. Ніяких припущень щодо того, що насправді роблять сценарії, не повинно бути необхідним. Це питання стосується того, як підключити події, що збігаються з входом та виходом з програми Unity.
aSteve

Відповіді:


9

Враховуючи Ваші вимоги до виконання роботи під час входу в Unity, а не для інших входів, завдання Upstart сесії здається ідеальним.

Можливо, ви це помітили: процеси, які запускаються після входу в графічний інтерфейс, перебувають під другим 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 (як вище), коли виконую "сервіс myjob start", я отримую "myjob: нерозпізнаний сервіс" Будь-які ідеї?
aSteve

Вирішили це: мені потрібно було використати "запустити мій", а не "запустити міобот". Ще однією корисною командою був "список initctl"
aSteve

@aSteve вибачте з цього приводу. Я виправив це,
muru

Нема проблем. Підхід на початку / сесії, безумовно, виглядає правильно. З цього приводу я ще не визначив найкращого способу використовувати його для виконання окремих (короткочасних) сценаріїв запуску та зупинки. Чи можу я використовувати лише 1 .conf файл чи мені потрібен 2? Це має бути "послуга" чи "завдання"? Чи варто використовувати перед / після запуску та перед / після зупинки? Мені не потрібно / хочу, щоб процес запускався між запуском і зупинкою ... якщо, напевно, не існує простого способу ввести значок на панель інструментів ... хоча це, мабуть, надмірна кількість - для моїх цілей.
aSteve

1
Нарешті. Після багатьох злому ... Я виявив, що мені потрібно звільнити міндтаск "в кінці сеансу", а не "на робочому столі". Це дещо контрінтуїтивно, але це працює. (Нарешті!)
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. Я вважав, що варто розмістити своє рішення тут - у випадку, якщо воно буде корисним для інших.


-1

Ось кілька пропозицій щодо запуску сценарію після входу:

Сценарій StackOverflow Linux після завантаження : Примітка Cliff полягає в тому, щоб помістити файл * .sh у /etc/profile.d.

Якщо ви хочете запустити сценарії під час завантаження, ось кілька пропозицій щодо цього:

Сценарій StackOverflow Linux після завантаження : Cliff notes - використовувати /etc/rc.local або crontab.


1
Жоден із цих варіантів не виглядає "правильним". Я хочу виконати сценарій лише тоді, коли входжу / вимикаюсь у сенсі початку / закінчення сеансу єдності. Я не хочу запускати свої сценарії щоразу, коли з’являється новий вхід. Нові входи можуть бути віддалено ініційовані через ssh тощо - але я не хочу, щоб вони виконували сценарій, оскільки вони не ініціювали новий сеанс Unity (на консолі).
aSteve
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.