Я читал последние пару часов о Upstart, .xinitrc, .xsessions, rc.local, /etc/init.d/, / etc / xdg / autostart, @reboot в crontab и многих других вещах что я полностью смущен!
Вот мой сценарий bash. Он должен запускаться / запускаться после запуска среды рабочего стола, и он должен продолжаться все время до выхода из системы / выхода из системы. Он должен начинаться снова при перезагрузке. Каждый раз, когда DE работает, он должен работать.
#!/bin/bash
while true; do
if [[ -s ~/.updateNotification.txt ]]; then
read MSG < ~/.updateNotification.txt
kdialog --title 'The software has been updated' --msgbox "$MSG"
cat /dev/null > ~/.updateNotification.txt
fi
sleep 3600
done
exit 0
Я знаю ноль об использовании Upstart, но я понимаю, что Upstart - это один из способов справиться с этим. Я рассмотрю другие подходы, но большинство из того, что я читал, слишком сложны для меня.
В моем вопросе есть два шага:
Как автоматически запускать выше, как описано выше. Как «установить» эту задачу Upstart с помощью сценария bash (т. Е. Моего «установщика»).Я предполагаю (или надеюсь), что шаг 2 почти тривиален, как только я понимаю шаг 1.
Я должен поддерживать все вкусы настольных компьютеров Ubuntu. Поэтому вызов kdialog выше будет заменен. Я рассматриваю другие подходы для этого. (Или я мог бы использовать zenity для gnome DE.)
Мои требования:
Как автоматически запустить сценарий выше, как описано выше. [d7 ] Как автоматически запустить сценарий выше, как описано выше. Как «установить» эту задачу Upstart с помощью сценария bash (т. Е. Моего «установщика»).Как «установить» эту задачу Upstart с помощью сценария bash (т. е. моего «установщика»).
Сценарий мониторинга (выше) должен запускаться без привилегий root. Но установщик (скрипт bash) может быть запущен как root. Я не настоящий разработчик или системный администратор. Для меня это добровольческая работа неполный рабочий день, поэтому она должна быть простой / простой. Я могу писать сценарии bash, и я могу немного программировать, но я ничего не знаю о Upstart или systemd, например. И, к сожалению, моя работа не дает мне времени, чтобы стать экспертом в системах init или большей частью чего-либо еще, связанного с разработкой и sysadmin. Поэтому я должен придерживаться простых решений.Процесс установки должен быть универсальным по всем производным Ubuntu, включая Unity и KDE и настольные компьютеры gnome. Тот же установочный скрипт (установщик) должен работать на Linux Mint, Kubuntu, Xbuntu (в основном, любой вкус Ubuntu и основных производных инструментов, таких как Linux Mint). Например, мы не можем продолжать ставить файл сценария в /home/$USER/.kde/Autostart/, потому что это существует только в KDE.
#!/bin/bash
source easybashgui
while true; do
if [[ -s ~/.updateNotification.txt ]]; then
read MSG < ~/.updateNotification.txt
message "$MSG"
cat /dev/null > ~/.updateNotification.txt
fi
sleep 3600
done
exit 0
Я, кажется, сталкиваюсь с незначительной проблемой с отличным ответом, предоставленным Эриком Карвалью.
Я создал файл .tar.bz и протестировал его, чтобы я мог его правильно извлечь:
tar xzf MyArchive.tar.bz -C /home/$USERN/Downloads/
Я создал bash header.sfx:
#!/bin/bash
USERN=`whoami`
if [ $(id -u) = "0" ] ; then
USERN=$SUDO_USER
fi
DATA=`awk '/^__BEGIN_DATA__/ { print NR + 1; exit 0; }' $0`
tail -n+$DATA $0 | tar xz -C /home/$USERN/Downloads/
if [ $? -ne 0 ] ; then
exit 1
echo
# Additional installation steps follow
#bash commands here
#the last command calls my main installer script:
bash ./another_bash_script.sh
exit 0 #this is line 125
# The following line must be the last one. Don't place any character (including newline characters) after it.
__BEGIN_DATA__
Я создал самораспаковывающийся файл / установщик оболочки:
cat header.sfx MyArchive.tar.bz > MyInstaller.sh
Я установил разрешения ( а + х). Результаты запуска установщика:
tester@mint15_VirtualBox ~/Downloads $ sudo ./MyInstaller.sh
./ExampleInstaller.2013.07.01.sh: line 132: syntax error near unexpected token `('
./ExampleInstaller.2013.07.01.sh: line 132: `.����D������V G��c�� ��������Ӭ��ӡ|@��|M�.�/�~��w�O��*��B���l�}Ω�O�.��'
Похоже, что файл MyArchive.tar.bz извлечен правильно, из внешнего вида в извлеченной папке.
Мое первое предположение заключалось в том, что exit 0 игнорируется, но я не уверен, почему это будет так ... Я заметил, что exit 0 находится в строке 125 и ошибка сообщается как строка 132, которая будет частью файла конкатенированного архива.
Следующее, что я пробовал, состоит из следующих изменений в headers.sfx:
первая строка:
#!/bin/bash -xv
последние строки:
exit 0
echo "we should never reach here!"
# The following line must be the last one. Don't place any character (including newline characters) after it.
__BEGIN_DATA__
На этот раз результат выглядит так:
tester@mint15_VirtualBox ~/Downloads $ sudo ./MyInstaller.sh
#!/bin/bash -xv
USERN=`whoami`
whoami
++whoami
[snip]
exit 0
echo "we should never reach here!"
# The following line must be the last one. Don't place any character (including newline characters) after it.
__BEGIN_DATA__
�#�Q��P\߷&�и����Ƶ��4 и��
��������Ӭ��ӡ|@��|M�.�/���B���l�}Ω�O�.
./ExampleInstaller.sh: line 134: syntax error near unexpected token `('
./ExampleInstaller.sh: line 134: `.����D���c��
Фактический вывод включает в себя намного больше
Первая ошибка, которую я сделал, это то, что я думал, что не должно быть новой строки char в конце последней строки в файле header.sfx. См. Ниже:
# The following line must be the last one. Don't place any character (including newline characters) after it.
__BEGIN_DATA__
Оказывается, что в конце строки должна быть новая строка __BEGIN_DATA__
. Вторая проблема, которую я обнаружил, заключается в том, что включение отладки bash (например, , set -x) предотвращает работу команд awk / tail / tar.
Эти два изменения заставили меня работать для меня на тестовом примере. (И это было просто одно изменение: исправление моего недоразумения в отношении последних символов новой строки.)
Однако на моем примере с реальной жизнью я столкнулся с дополнительными проблемами. Оказывается, что права доступа к файлам внутри архива имеют значение. В моем архиве был один файл с очень ограниченными разрешениями, и этот файл заставлял весь самораспаковывающийся скрипт bash терпеть неудачу на этапе извлечения. Тем не менее, вручную удалены файлы в файловом менеджере графического интерфейса или в командной строке с использованием tar. Таким образом, самораспаковывающиеся скрипты bash немного более чувствительны к таким вещам, как права на файлы внутри архива (и я не говорю о разрешениях на сам архив).
Кроме того, любой «конечный мусор» вызовет самораспаковывающийся скрипт bash для отказа. Пример:
gzip: stdin: decompression OK, trailing garbage ignored
У меня было это сообщение из одного архива, и самораспаковывающийся скрипт bash не смог выполнить какие-либо команды после извлечения (хотя извлечение, кажется, было прекрасным, как говорится в сообщении ). Возможно, что-то вроде 2> /dev/null рассмотрит этот последний вопрос ...