Как создать (через скрипт установщика) задачу, которая будет устанавливать мой сценарий bash, чтобы он запускался при запуске DE?

Я читал последние пару часов о 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

1
задан 1 July 2013 в 00:23

1 ответ

Я, кажется, сталкиваюсь с незначительной проблемой с отличным ответом, предоставленным Эриком Карвалью.

Я создал файл .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 рассмотрит этот последний вопрос ...

0
ответ дан 24 May 2018 в 20:28
  • 1
    Ошибка возникает из строки 132 в файле ExampleInstaller.2013.07.01.sh, она же загружена с помощью «bash ./another_bash_script.sh" ;? Проверьте его содержимое. – Eric Carvalho 3 July 2013 в 03:37
  • 2
    Спасибо, что посмотрели на него. Я могу выполнить " bash ./another_bash_script.sh" напрямую, и это не дает ошибок. Кроме того, строка 132 представляет собой линию комментариев. Я поместил параметр отладки bash (-x) в файл заголовка и снова протестировал. Я расскажу об этом выше. – MountainX 3 July 2013 в 06:40
  • 3
    Я замечаю, что добавление пары строк в файле header.sfx (но не изменение архива) приводит к тому, что номер строки в сообщении об ошибке увеличивается на 2. Таким образом, ошибка возникает из архива, объединенного с header.sfx (as если выход 0 игнорируется). – MountainX 3 July 2013 в 06:54
  • 4
    Какие команды вы выполняете между & # # Дополнительные шаги установки следуют " и "bash ./another_bash_script.sh" ;? Попробуйте bash ./another_bash_script.sh &. Также вы можете начать с «Дополнительные шаги» и «Нет». и добавьте, скажем, 10 строк за раз до начала ошибки. – Eric Carvalho 3 July 2013 в 07:09
  • 5
    Я удалил все дополнительные команды. Я все еще получаю ошибку. Однако эта ошибка должна быть «специальным случаем». Метод и концепции, которыми вы поделились, являются действительными, и я получу от них много пользы. Я продолжу отлаживать текущую проблему самостоятельно, потому что я думаю, что сейчас я понимаю это достаточно хорошо, чтобы понять настоящую проблему. Еще раз спасибо. – MountainX 3 July 2013 в 07:57

Другие вопросы по тегам:

Похожие вопросы: