- 📑 Настройка автозапуска скриптов в Linux Ubuntu/Mint
- Создание скрипта в init.d для запуска во время инициализации системы
- Загрузка с помощью rc.local после загрузки системы
- Управление автозагрузкой сервисов и скриптов в Linux
- Systemd: управление автозагрузкой служб в Linux
- Добавление сервиса в systemd
- Удаление сервиса из systemd
- Systemd: маскировка юнитов
- Автозапуска скриптов и сервисов с помощью rc.local
- Создание собственного демона и добавление его в systemd
- Автозапуск через cron
- .bashrc: автозапуск скриптов при запуске терминала
- python скрипт не запускается через автозагрузку
📑 Настройка автозапуска скриптов в Linux Ubuntu/Mint
Здесь рассматриваются способы настройки автозапуска скриптов в Ubuntu/Mint только в консольном режиме.
Создание скрипта в init.d для запуска во время инициализации системы
Для начала нужно создать скрипт и скопировать его в директорию /etc/init.d/ удобным для вас способом, а затем сделать его исполняемым командой:
Теперь необходимо добавить его в автозагрузку:
Скрипт запуститься во время инициализации системы.
Удалить из автозагрузки можно так:
Загрузка с помощью rc.local после загрузки системы
Необходимо создать скрипт в любой директории, где вам удобно и сделать его исполняемым как в первом способе.
Затем подправить файл rc.local любым редактором текста, например nano:
Изначально скрипт rc.local пустой и содержит только:
Пропишите полный путь скрипта перед строчкой exit 0 и сохраните файл.
Как сказано в комментариях в эталонном rc.local делаем его исполняемым (хотя во многих дистрибутивах он изначально исполняемый):
Скрипт выполниться после загрузки системы .
Однако в последних версиях Ubuntu (например в Ubuntu 18.04) в директории /etc нет файла rc.local и его необходимо создать и сделать исполняемым:
Все, скрипт должен автоматически запускаться.
Источник
Управление автозагрузкой сервисов и скриптов в Linux
В данной статье мы рассмотрим основы управлением автозагрузкой сервисов и скриптов в Linux CentOS 7/8. В частности, разберем основы работы с демоном systemd, научимся добавлять в автозагрузку сервисы и убирать их оттуда, а также рассмотрим альтернативные варианты запуска скриптов или демонов после старта системы.
Задача статьи – научить вас быстро разобраться со списками служб и скриптов которые запускаются в Linux автоматически, добавить в автозагрузку свои службы или скрипты, или отключить автозапуск определённых программ.
Systemd: управление автозагрузкой служб в Linux
В большистве популярных современных популярных дистрибутивов Linux (CentOS 7, RHEL, Debian, Fedora и Ubuntu) в качестве демона автозагрузки вместо init.d используется systemd. Systemd – менеджер системы и служб Linux, используется для запуска других демонов и управления ими в процессе работы, использует unit-файлы из /etc/systemd/system (init.d использовал скрипты из каталога /etc/init.d/). Systemd позволяет распараллелить запуск служб в процессе загрузки ОС, тем самым ускоряя запуск.
Для управления system используется команда systemctl.
Для начала, после загрузки системы, мы проверим список юнитов, которые в данный момент добавлены в systemd:
Список unit-файлов можно получить командой:
Данная команда отобразит все доступные юнит-файлы (не зависимо от того, были они загружены в systemd после загрузки ОС или нет).
Чтобы вывести список активных сервисов и их состояние, выполните:
# systemctl list-units -t service
Следующая команда выведет список юнитов, которые загрузил или пытался загрузить systemd. Так как после запуска некоторые юниты могут стать неактивными, с помощью флага —all вы получите полный список.
# systemctl list-units —all
Как видим из списка, здесь отображаются даже сервисы, которые не были найдены на диске «not-found».
Использую данную команду, вы можете добавить и другие флаги, например:
- —state — используется для определения состояния демона Load, Active, Sub
- —type — позволяет фильтровать юниты по их типу.
systemctl list-units —all —state=active — выведет список только активных юнитов
systemctl list-units —type=service — выведет список юнитов, которые являются сервисом.
Добавление сервиса в systemd
Для управления сервисами в systemd используется особый синтаксис. После имени серверсв в конце нужно указывать .service. Например:
systemctl enable nginx.service – команда добавит в автозагрузку веб-сервер nginx
Данная команда создаст символическую ссылку на копию файла, указанного в команде сервиса, в директории автозапуска systemd.
# systemctl enable nginx.service
Чтобы посмотреть добавлен тот или иной сервис в автозагрузку, можно проверить его статус:
systemctl status nginx.service
При выводе нужно обратить внимание на строку:
Значение enabled означает что данный сервис загружается автоматически (добавлен в автозагрузку). Если сервис не загружается автоматом, здесь буде указано disabled.
Удаление сервиса из systemd
Вы можете удалить сервис из автозагрузки, чтобы он не запускался после старта Linux (при этом сам сервис с сервера не удаляется). Чтобы удалить сервис из автозагрузки, выполните команду:
systemctl disable нужный_сервис
Например, чтобы удалить из автозагрузки nginx, выполните:
# systemctl disable nginx.service
После выполнения команды, симлинк на файл сервиса будет удален из директории systemd. Можно проверить, есть ли юнит в автозагрузке:
# systemctl is-enabled sshd
Systemd: маскировка юнитов
В моей практике встречались «вредные» сервисы, которые после удаления их из автозагрузки, все равно там оставались и запускались после рестарта ОС. Чтобы решить этот вопрос, можно замаскировать сервис:
systemctl mask nginx.service
И после этого, он вообще не будет запускаться, ни вручную, ни после перезагрузки ОС:
# systemctl mask nginx.service
# service nginx restart
Снять маску можно командой:
# systemctl unmask nginx.service
Если после маскировки сервиса, вы проверите юнит-файлы, то увидите, что сервис помечен как замаскированный (состояние masked):
Таким нехитрым способом, можно избавить себя от удаления сервиса, даже если он не удаляется из автозагрузки systemd.
Автозапуска скриптов и сервисов с помощью rc.local
Для запуска различных скриптов при загрузке Linux чаще всего используется rc.local.
Но помимо скриптов, через rc.local так же можно и запускать сервисы, даже те, которые запускаются через systemd. Не могу ответить на вопрос, для чего использовать в таком случае rc.local, если есть systemd, но пару примеров я приведу.
Начнем с того, что файл /etc/rc.local должен быть исполняемым:
chmod +x /etc/rc.local
Rc.local должен быть добавлен в автозагрузку systemd:
systemctl enable rc-local
И на примере того же nginx, мы можем добавить в rc.local команду запуска веб-сервера:
service nginx start
Но я редко использую rc.local для запуска сервисов. Чаще rc.local используется, когда нужно запустить скрипт, либо выполнить разово какую-то команду.
К примеру, я создал скрипт /root/test.sh который выполняет некоторые действия, и хочу запустить его сразу после запуска системы. Добавляем в файл rc.local строку:
Начиная с CentOS 7, разработчики указывают на то, что rc.local устаревший демон и осуществлять автозапуск скриптов или сервисов через него, это прошлый век. Но пока он работает, я пользуюсь им, так как он очень прост в эксплуатации.
Создание собственного демона и добавление его в systemd
Вы можете создать собственный демон, которым можно будет управлять через systemd.
Например, нам нужно запускать все тот же скрипт /root/test.sh после перезагрузки системы. Начнем с создания файла нашей будущей службы:
touch /etc/systemd/system/test-script.service
chmod 664 /etc/systemd/system/test-script.service
nano /etc/systemd/system/test-script.service
Содержимое файла будет следующее:
User – пользователь под которым будет запускаться демон
Type=oneshot — процесс будет завершен до запуска дальнейших юнитов
Проверяем и перезапускаем:
# systemctl daemon-reload
# systemctl start test-script.service
# systemctl status test-script.service
Если вас устроило то, как работает сервис, добавьте его в автозагрузку:
# systemctl enable test-script.service
Таким образом, вы можете добавить любой ваш скрипт в автозагрузку через systemd.
Автозапуск через cron
Если вам с какой-то периодичностью нужно запускать скрипт или команду, вы можете воспользоваться cron-ом:
crontab -e — открыть терминал для написания задания cron
И добавьте туда нужное вам задание, например:
* * * * * /root/test.sh — запускать скрипт каждую минуту.
Можно написать скрипт watch-dog, который по заданию будет проверять, например, статус какого-либо сервиса и, если он не работает, запускать его. На нескольких своих проектах я использую подобную схему.
Чтобы вывести список всех заданий в крон, нужно выполнить команду:
Допустимые значения для времени запуска заданий cron по порядку:
- Минуты от 0 до 59
- Часы от 0 до 59
- День месяца от 1 до 31
- Месяц от 1 до 12
- День недели от 0 до 7 (0 или 7 это воскресение)
В нашем задании скрипт запускается каждую минуту, поэтому там стоят «*».
Так же вы можете разместить нужный вам скрипт в директориях cron:
- /cron.daily – выполнение скрипта ежедневно
- /cron.hourly – выполнение скрипта ежечасно
- /cron.monthly — выполнение скрипта ежемесячно
- /cron.weekly — выполнение скрипта еженедельно
Скрипты в указанных директория будут запускаться согласно автоматически подготовленного расписания.
.bashrc: автозапуск скриптов при запуске терминала
Если вам требуется выполнять какие-то действия при запуске терминала ssh, вы можете добавить любую команду или выполнение скрипта в .bash_profile или .bashrc. Теоретически, вы можете добавить какое-либо действие в любой из этих файлов, оно выполнится в любом случае. Обычно все необходимое добавляется в .bashrc, а сам .bashrc запускают из .bash_profile.
Я добавил в файл .bashrc команду на рестарт веб-сервиса nginx:
service nginx restart
После этого сохранил файл и перезапустил терминал:
Как видите, при запуске терминала, веб-сервер был перезапущен. Какие действия можно выполнять при запуске терминала? Вероятно, запускать какие-то вспомогательные утилиты, например, проверка uptime сервера:
Или вы хотите, чтобы при запуске терминала, вы сразу попадали в нужную вам директорию и запускали mc, добавьте в .bashrc
Надеюсь эта статья по управлению автозапуском сервисов и скриптов в LInux (статья писалась для CentOS) оказалась полезной для вас. Наверняка тем, кто только познает азы системного администрирования Linux, это информация будет кстати.
Источник
python скрипт не запускается через автозагрузку
При запуске вручную из консоли скрипт запускается, но когда я помещаю его в /storage/.config/autostart.sh и перезагружаю систему скрипт не отрабатывает. При этом первая строка с шебангом:
Пробовал заменить на
А где File «/storage/.config/script.py», line 6, in ?
Ладно, я на сегодня всё. Завтра зайду.
в логе есть, но когда полностью journalctl без ключа C10.
Ок, спс за помощь, может утро вечера мудренее и завтра получится победить сабж.
Вероятно глупость предложу, но может через login shell его запустить в автозапуске? Помнится, когда-то мне с чем-то помогло.
Попробуй в своём autostart.sh
(либо sh, смотря есть ли у тебя там bash)
попробовал, не помогло.
в логе та же ошибка на 4 строку с import mysql:
Жаль. А второй python в этой системе стоит? Может pip не для той версии ставит? Глянь что выводит сейчас в загруженной консоли:
- which pip
- which pip3
- env | grep VIRTUAL_ENV
То бишь python -vv вместо python . И глянуть лог.
Капец, где все те суперкрутые питонисты, девопсы лора за $100’500/sec? Молчат как рыбы. Я даже не питонист.
Ну как-то странно, что только часть (одна строка) бэктрейса в лог попадает.
Давай так. В /storage/.config/autostart.sh вызови скрипт такой строкой:
После перезагрузки посмотри script.log .
такой переменной нет
добавил в скрипт python3 -vv, но после ребута та же ошибка в логе на строку import mysql.
суперкрутые питонисты просто в воскресенье отдыхают после жёстких овертаймов на джобе))
в /storage/.config/script.log такое появилось
Проблема получается в том, что модуль до вызова скрипта импортировался второй версией питона и в кеше питона теперь скомпилированный модуль для второй версии, которую ошибочно пытается подгрузить третья. Может права на запись не дают переписать кеш. Я не знаю как это по-нормальному исправить. Удалять кеш питона каждый раз, наверное, не очень правильно.
Возможно лучше будет установить pymysql и другие необходимые модули для рута и импортировать их обычным образом, убрав sys.path.append(‘/storage/.opt/lib/python3.8/site-packages’) из скрипта.
Можно, конечно, попробовать удалять только файлы кеша, типа:
но, скорее всего, эта ошибка и с другими модулями будет: с cryptography и settings . Просто pymysql сейчас первый стоит, вот на нём и спотыкается.
Но ты сначала попробуй просто вручную кеш удалить и перезагрузиться, может поможет. Можешь из обоих путей кеш почистить:
У тебя, видимо, стоит питон версии 3.7, а модули ты загружаешь скомпилированные для 3.8. Может быть тогда вместо удаления просто обновить питон до 3.8?
Запускай тогда свой скрипт через
вот смотри, безотносительно к корректности самого скрипта(оставим на совести пейсателя). Если вручную, в консоли ты его запускаешь, он отрабатывает,так? Допустим отрабатывает так, как задумано, всё в ёлочку. Тогда, для того, чтобы штатный autostart в linux это хозяйство запустил, тебе нужно сделать всего две вещи:
1) дай этому скрипту права на запуск, ну там chmod +x script.py, и закинь его в PATH — /bin /usr/bin или /yjme/matherfaker/.choo/bin, не важно, туда, где голая, системная PATH гарантированно вернёт тебе его положение.
2) в том месте, где autostart штатно(для твоего случая) что-то там запускает, вопрос конечно, как оно там у тебя устроено, но не важно, то, что должно запускать, запускать этот скрипт должно командой : exec=script.py .
Как пример приведу пример автостарта при логине в учётную запись:
/.config/autostart создаёшь файл myscript.desktop с такими строчками:
понятно что у тебя другие условия, я привёл пример, как это должно работать.
Источник