bash-скрипт не запускается при старте

Вопрос или проблема

Я создал простой bash-скрипт под названием echo.sh. Он выводит строку. Я убедился, что он исполняемый. Затем я добавил его в программу “автозапуска” через графический интерфейс. Однако когда я перезагружаю свою машину, похоже, что он не был выполнен, так как никакого вывода в терминале нет.

Насколько я понимаю, разве скрипт не должен автоматически открывать терминал при выполнении, поскольку STDOUT является файлом терминала? Однако скрипт работает нормально, если я запускаю его сам из терминала.

echo.sh

#!/bin/bash

echo "hello this is a bash script talking"

Сделать его исполняемым

chmod +x echo.sh

Добавление в “автозапуск” с правильным каталогом к файлу
/home/sam/Documents/bash/echo.sh

Результат

Однако когда я перезагружаю систему, скрипт не выполняется как ожидалось, и терминал не появляется с сообщением echo. Я не уверен, почему так, и мог бы совершенно не понять сути, если это так, пожалуйста, дайте мне знать.

Просто чтобы отметить, все мои другие bash-скрипты работают, такие как скрипт “cleanup.sh”, который также находится в программе “автозапуск”.

Попытки исправления

Я пытался перенаправить STDOUT в файл терминала /dev/tty. Однако это, похоже, не сработало.

#!/bin/bash

echo "hello this is a bash script talking" >/dev/tty

Я также протестировал bash-скрипт с простой командой rm, чтобы проверить, только ли команда echo создает проблему. Однако, когда он добавляется в автозапуск или .bashrc файл, он не удаляет test.txt в том же каталоге, что и скрипт. Однако работает, когда я выполняю его вручную из терминала.

#!/bin/bash

rm ./test.txt

Я также протестировал программу автозапуска, просто открыв Firefox, с командой Firefox. Это работает без проблем. Так что, похоже, нет проблем с программой автозапуска?

Скрипт, вероятно, работает, но STDOUT скрипта (куда бы ни был направлен вывод) подключен к процессу в вашей ОС, который отвечает за запуск таких скриптов, который не выполняется в терминале, но является скрытым процессом пользователя, например, в ядре. Чтобы открыть терминал с этим сообщением, вы, вероятно, должны изменить его на

#!/bin/bash
gnome-terminal -e 'echo "hello this is a bash script talking"'

(Я сейчас не на Ubuntu, так что не могу это протестировать, но суть в том, чтобы явно открыть терминал, где вы хотите, чтобы это сообщение появилось)

Вы можете проверить конфигурационный файл автозагрузки, который вы создали, с помощью

cat ~/.config/autostart/NAME.desktop

Если вы хотите выполнить свой скрипт в терминале, вы должны добавить
Terminal=true
в файл.
Вы также можете установить Hidden=false в зависимости от того, что вы хотите достичь.

Самый простой метод — использовать crontab следующим образом;

crontab -e

Добавьте свой скрипт в конец файла crontab

#
@reboot /path-to-your-script/your-script-name.sh

Затем перезагрузите, чтобы увидеть изменения

Вы должны добавить /bin/bash -c перед вашим '/path/to/your/script.sh'

/bin/bash -c '/path/to/your/script.sh'

Вывод команды echo будет виден в ваших системных журналах, а не в вашем терминале.

journalctl -b покажет вам вывод журналов загрузки системы, когда выполняется ваш скрипт.

Ответ или решение

Скрипт Bash не запускается при старте системы: возможные причины и решения

Если ваш скрипт echo.sh, который выводит строку, не запускается автоматически при загрузке системы, это может быть связано с несколькими причинами. Ниже представлены возможные причины проблемы и способы их решения.

Проблема с выводом в терминал

Когда вы добавляете свой скрипт в "Программы запуска" через графический интерфейс, он запускается, но не в терминале, что объясняет отсутствие видимого вывода. Обычно, когда воплощаете запуск скрипта, он выполняется в скрытом процессе, не связанном с вашим терминалом.

Решения

  1. Запуск в терминале:
    Чтобы выводить сообщения вашего скрипта в терминал, вам необходимо явно указать, что скрипт должен выполняться в терминале. Вы можете изменить ваш скрипт следующим образом:

    #!/bin/bash
    gnome-terminal -e 'bash -c "echo \"hello this is a bash script talking\"; exec bash"'

    Этот код откроет новый терминал и выполнит ваш скрипт, а затем оставит терминал открытым, чтобы вы могли увидеть вывод.

  2. Настройка файла автозапуска:
    Если вы создаете файл автозапуска (например, my_script.desktop в ~/.config/autostart/), добавьте следующие строки:

    [Desktop Entry]
    Type=Application
    Exec=/path/to/your/echo.sh
    Terminal=true
    Hidden=false

    Убедитесь, что путь к вашему скрипту указан правильно. Добавление Terminal=true заставит систему запускать ваш скрипт в терминале.

  3. Использование crontab:
    Альтернативный способ — использование cron для автоматического запуска скрипта при загрузке. Выполните следующую команду в терминале:

    crontab -e

    И добавьте строку:

    @reboot /path/to/your/echo.sh

    Это обеспечит выполнение вашего скрипта при перезагрузке системы.

  4. Запуск через системные логи:
    Если вы хотите видеть вывод скрипта в системных логах (например, если это не обязательно выводить в терминале), вы можете перенаправить вывод вашего скрипта в системный лог:

    #!/bin/bash
    echo "hello this is a bash script talking" >> /var/log/my_script.log

    Вы будете в состоянии видеть вывод с помощью команды:

    journalctl -b

Программные ошибки

Если вы уверены, что скрипт работает корректно, но при этом он не выполняется, убедитесь, что:

  • Скрипт имеет разрешения на исполнение (вы можете удостовериться в этом, используя chmod +x echo.sh).
  • Путь к скрипту указан правильно в настройках автозапуска или в crontab.

Проверка обновления системы

Также стоит убедиться, что у вас установлены все последние обновления, что может устранить некоторые возможные баги, влияющие на запуск скриптов.

Заключение

Вышеуказанные подходы должны помочь вам устранить проблему с выполнением вашего скрипта при запуске системы. Обязательно проверьте настройки и убедитесь, что все пути указаны правильно. С помощью предложенных решений вы сможете оптимально настроить автоматический запуск вашего Bash-скрипта.

Оцените материал
Добавить комментарий

Капча загружается...