Выполнение команды при запуске linux

Обновлено: 05.07.2024

Решено: Выполнение команд при запуске терминала.

Для новичков как вообще в Linux, так и в конкретной теме, к которой относится вопрос.

Модератор: Bizdelnick

Решено: Выполнение команд при запуске терминала.

чтобы подключиться к интернету мне необходимо запустить терминал, ввести "wvdial" и нажать "Enter". Можно ли сократить действия до запуска терминала? Т.е. чтобы при запуске терминала команда "wvdial" запускалась автоматически?

Бог создал рай, а Дьявол - Краснодарский край!

ASPLinux 12 CARBON

В свое время пользовался для таких целей простыми ярлычками на рабочем столе. Думаю создать их не будет труда. Никогда не работал с wvdial, она какая то интерактивная, что надо запускать целый терминал?

Можно создать ярлык и в нем: wvdial && console, т.е. после успешного запуска wvdial будет открыта консоль.

чтобы подключиться к интернету мне необходимо запустить терминал, ввести "wvdial" и нажать "Enter". Можно ли сократить действия до запуска терминала? Т.е. чтобы при запуске терминала команда "wvdial" запускалась автоматически?
Вы можете вставить эту команду в файл /home/user/.bashrc
и тогда эта команда станет выполняться при каждом новом запуске эмулятора терминала это более похоже на то что мне надо.
если создать такой ярлык

будет запускаться консоль, а потом wvdial? а как потом закрыть кансоль?

Бог создал рай, а Дьявол - Краснодарский край!

ASPLinux 12 CARBON

это более похоже на то что мне надо.
если создать такой ярлык

будет запускаться консоль, а потом wvdial? а как потом закрыть кансоль?

Бог создал рай, а Дьявол - Краснодарский край!

ASPLinux 12 CARBON

создай простой текстовый файл, в котором примерно следующее напиши:

вместо xterm можно konsole, или gnome-terminal, или какой там твой терминал любимый(у них у всех -e вроде как одно и тоже значит), дай файлу права на выполнение:

chmod a+x /path/to/my_file.sh

когда надо запустить wvdial просто кликай по файлу(ну как обычные програмки запускаешь), и в появившейся ругани выбирай Run(Запустить). Если надо запустить wvdial так чтобы оно работало себе в фоне, а консоль пофиг: вместо xterm -e wvdial просто напиши wvdial & (правда если там оболочка, то оболочке может не понравится это).

Про systemd читал только в срачах на ЛОРе, 'man systemd' и прочее не предлагать, хочется конкретного ответа, а не перечитать тонну документации ради того чтобы влепить одну команду.


Про systemd читал только в срачах на ЛОРе
'man systemd' и прочее не предлагать

Да ты поехавший!


Тут где-то мелькало, что в fedora поддерживается /etc/rc.local


В 17-й что-то не особо поддерживается, даже если создать rc.local и в rc5.d ссылку скинуть.


А конкретнее не? А то там много лишней мути для одной простой команды.

что у тебя внутри /etc/rc.d/rc.local ?


Там меньше одной печатной страницы. ExecStart.


Меньше, но оно не работает:


и на что только люди не идут, лишь бы BSD-Init не пользовать.


Ну это само собой =) Но надо ведь посмотреть в чем соль хваленого systemd. Пока что от него только проблемы и куча лишних телодвижений.


кошерный метод для таких операций:

Там пол странички текста. И один кусок кода для копипаста.

Это меньше чем этот тред по объему. Не ленись.

Но надо ведь посмотреть в чем соль хваленого systemd

. но при этом посмотреть так чтобы не прочитать ни одного мана.

лоровцы - такие лоровцы


Это меньше чем этот тред по объему. Не ленись.

Читай выше, пример не рабочий.

У всех рабочий, а у тебя не рабочий )

Отлаживай: service ati_cooler status посмотри, /var/log/messages, вывод в лог куда-нибудь вставь.


Ты скажи прямо - тебе дело делать или по поводу systemd холиварить?

Если второе, то ты очень криво вбросил. Да, любая новая и непривычная технология на первых порах требует, чтобы с ней ознакомились, и вставать тут в позу хомячка, который ничего не читал и не собирается, и гордится этим, вообще говоря стыдно.


Конечно дело делать.

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

Вот например, простой адекватный исчерпывающий ответ на простой вопрос про выполнение команд при запуске Как выполнить команду при запуске ОС? (комментарий), а ты мне тут разводишь демагогию.

Тебе ответили по существу: любой запуск скрипта есть systemd-юнит. Так есть и так работает у большинства. Если у тебя не работает, надо не писать о том какой systemd плохой, а понять что ты сделал не так. И это можно понять поглядев лог и задавшись простейшими вопросами:

1) запускается ли тобой написанный сервис вообще?

2) каков код возврата?

3) выполняется ли скрипт, пишет ли он отладочный вывод?

Для того чтобы на них ответить не надо быть спецом, не надо читать маны по systemd, и вообще кроме человеческой логики больше ничего не требуется. Но нет, вместо чтения логов давай ещё пофлудим, а то вечером делать нечего )


Siado

В 17-й что-то не особо поддерживается, даже если создать rc.local и в rc5.d ссылку скинуть.

Ну так там пару команд ещё выполнить нужно, чтобы systemd сожрал rc.local.


/etc/rc.local может быть заменён на /etc/rc.d/rc.local или другое.
Зависит от дистрибутива.

И это вопрос от трёхзвёздочного?


А что удивительного?
systemd организован таким образом что на простое действие есть гордиев узел документации.
К примеру, как изменить порядок загрузки демонов, я за 3 часа на офф-сайте не нашел.

К примеру, как изменить порядок загрузки демонов, я за 3 часа на офф-сайте не нашел.

Не надо людей в заблуждение вводить. Уж что-что а документация по systemd замечательная, всем остальным на зависть. Да, её конечно надо почитать немножко перед тем как творить что-то отличное от дефолта, но написана она хорошим понятным английским языком и очень четко структурирована.


А можно вывод ls -l /root/ati_cooler показать?


Спасибо, дельный совет. Но я уже через udev сделал, чтобы с systemd не париться =)

infoitcomua1

В данной статье мы рассмотрим основы управлением автозагрузкой сервисов и скриптов в 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 после загрузки ОС или нет).

Чтобы вывести список активных сервисов и их состояние, выполните:

Следующая команда выведет список юнитов, которые загрузил или пытался загрузить systemd. Так как после запуска некоторые юниты могут стать неактивными, с помощью флага —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 status nginx.service

При выводе нужно обратить внимание на строку:

Значение enabled означает что данный сервис загружается автоматически (добавлен в автозагрузку). Если сервис не загружается автоматом, здесь буде указано disabled.

Удаление сервиса из systemd

Вы можете удалить сервис из автозагрузки, чтобы он не запускался после старта Linux (при этом сам сервис с сервера не удаляется). Чтобы удалить сервис из автозагрузки, выполните команду:

systemctl disable нужный_сервис

Например, чтобы удалить из автозагрузки nginx, выполните:

После выполнения команды, симлинк на файл сервиса будет удален из директории systemd. Можно проверить, есть ли юнит в автозагрузке:

Systemd: маскировка юнитов

В моей практике встречались «вредные» сервисы, которые после удаления их из автозагрузки, все равно там оставались и запускались после рестарта ОС. Чтобы решить этот вопрос, можно замаскировать сервис:

systemctl mask 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 — процесс будет завершен до запуска дальнейших юнитов

Если вас устроило то, как работает сервис, добавьте его в автозагрузку:

Таким образом, вы можете добавить любой ваш скрипт в автозагрузку через 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, это информация будет кстати.

Иногда пользователи могут столкнуться с необходимостью добавления каких-то сервисов или событий в автозагрузку Linux системы (Ubuntu, Debian, CentOS, Gentoo, Alpine Linux и так далее), но не всегда удается сделать это встроенным в графическую среду средствами (например Startup Applications в Ubuntu). То, как сделать простой скрипт и добавить его запуск при инициализации системы будет рассказано ниже.

Для начала создадим скрипт запуска в стандартном каталоге инициализации системы:

sudo nano /etc/init.d/odchub

В текстовом редакторе введите три строки будущего скрипта:

После того как файл создан, сделаем его исполняемым:

sudo chmod +x /etc/init.d/odchub

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

Если вывод команды:

sudo nano /etc/systemd/system/odchub.service

В текстовом редакторе скопируйте следующие строки в этот файл:

[Unit]
Description=Opendchub service
After=network.target
[Service]
ExecStart=/etc/init.d/odchub
[Install]
WantedBy=multi-user.target

После сохранения файла юнита вы можете использовать созданную службу odchub, например, стартовать (единократно выполнить написанный нами скрипт):

sudo systemctl start odchub

sudo systemctl enable odchub

Для удаления созданной таким образом службы, достаточно пары команд:

sudo systemctl disable odchub
sudo rm /etc/systemd/system/odchub.service

После того как создан исполняемый скрипт в соответствующей директории (в нашем случае /etc/init.d/odchub), для включения его при загрузках системы, достаточно выполнить команду:

sudo update-rc.d odchub defaults 90

Числовое значение после слова defaults указывает на приоритет для старта этого скрипта.

В результате этих действий сервис opendchub будет запускаться еще до загрузки графической среды, сразу вместе с инициализацией операционной системой. Если вы захотите удалить этот скрипт из автозагрузки, то перед тем как удалить сам файл надо выполнить такую команду:

sudo update-rc.d -f odchub remove

Используя эти простые примеры вы можете аналогичным образом создать свой собственный скрипт и добавить его к автозагрузке.

12 Comments Leave a comment

Огромное спасибо.
очень пригодилось для автоматического монтирования расшаренного диска в виртуальной манине

Подскажите, а этот скрипт будет стартовать для конкретного пользователя или для всех.
У меня просто стоит NX сервер и мне нужно каждый раз вручную логиница и запускать скрипт для расшара папки.
P.S. Заранее спасибо!

Igor, этот скрипт будет запускаться под пользователем root при инициализации системы. Также, можно написать специальный скрипт, который сможет запускать различные программы под какими-то определенными пользователями.

А NX server исправно автозапускается после установки из deb с официального сайта. Вы собирали его из исходного кода?

Читайте также: