Как я могу запускать скрипты автоматически при запуске Ubuntu, чтобы мне не приходилось запускать их вручную после запуска?
В зависимости от того, какие скрипты вам нужно запустить... Для сервисов и тому подобного вы должны использовать upstart. Но для пользовательского скрипта они должны быть запущены как сеансовые скрипты gnome! Посмотрите в разделе System > Preferences > Startup Applications.
На заметке, если вам нужны некоторые скрипты для запуска при входе в терминал, вы можете добавить их в файл .bash_login в вашем домашнем каталоге.
Простая команда (которая не должна оставаться запущенной) может использовать задание Upstart типа:
start on startup
task
exec /path/to/command
Сохраните это в файле .conf
в /etc/init
(если вам нужно, чтобы она выполнялась от имени root при загрузке системы), или в ~/.config/upstart
(если вам нужно
для запуска от имени пользователя при входе в систему).
Один из подходов - добавить задачу @reboot cron:
crontab -e
позволит вам редактировать ваш cron.Добавление к нему такой строки:
@reboot /path/to/script
выполнит этот скрипт после загрузки компьютера.
Вы можете добавить команды в /etc/rc.local
:
sudo nano /etc/rc.local
Это выполняет команды от имени root.
Для выполнения команд от имени конкретного пользователя используйте sudo -i -u
(-i
, чтобы также запустить оболочку для входа в систему). Например, для создания постоянного туннеля SSH, где myhost
определено в файле johndoe
s ~/.ssh/config
:
sudo -i -u johndoe autossh -nNT -L 1234:localhost:1234 myhost
Обратите внимание, что если /etc/rc.local
не существовало (как в случае с Ubuntu с 16. 04), вам нужно добавить строку shebang сверху (например, #!/bin/bash
) и убедиться, что файл исполняемый:
sudo chmod a+x /etc/rc.local
Существуют различные способы автоматического выполнения команд:
Система upstart выполнит все скрипты, из которых найдена конфигурация в каталоге /etc/init
. Эти скрипты будут выполняться во время запуска системы (или в ответ на определенные события, например, запрос на выключение), а также в месте выполнения команд, которые не взаимодействуют с пользователем; все серверы запускаются с помощью этого механизма.
Вы можете найти введение, которое можно прочитать по адресу:
/etc/init: http://upstart.ubuntu.com/getting-started.html man pages man 5 init
и man 8 init
дают вам полную информацию.
Скрипт оболочки с именем .gnomerc
в вашем домашнем каталоге автоматически исходит каждый раз, когда вы входите в сеанс GNOME. Вы можете поместить туда произвольные команды; переменные окружения, которые Вы установите в этом сценарии, будут видны любой программе, которую Вы запустили в сеансе работы.
Обратите внимание, что сеанс работы не начнётся до тех пор, пока сценарий .gnomerc
не будет закончен; поэтому, если Вы хотите автоматически запустить какую-нибудь давно работающую программу, Вам нужно добавить и
к вызову программы, чтобы отсоединить её от работающего shell'а.
Опция меню System -> Preferences -> Startup Applications позволяет Вам определить, какие приложения должны быть запущены при запуске графического сеанса (Ubuntu предопределяет довольно много), и добавить или удалить их по своему усмотрению. Это имеет почти то же самое назначение и область применения скрипта .gnomerc
, за исключением того, что Вам не нужно знать синтаксис sh
(но Вы также не можете использовать какую-либо sh
программную конструкцию).
Для простых вещей вы можете добавить команду в System->Preferences->Sessions, указывающую на местоположение вашего сценария.
Или вы можете добавить его в /etc/init.d/rc.local или выполнить upstart, если это более низкий уровень .
Посмотрите на https://help.ubuntu.com/community/UbuntuBootupHowto для получения дополнительной информации
Чтобы запустить (кратковременную) команду 1 при запуске с помощью systemd
, вы можете использовать systemd блок типа OneShot
. Например, создайте /etc/systemd/system/foo.service
, содержащий:
[Unit]
Description=Job that runs your user script
[Service]
ExecStart=/some/command
Type=oneshot
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
Затем запустите:
sudo systemctl daemon-reload
sudo systemctl enable foo.service
По сути, это просто преобразование типичного задания Upstart в systemd один (см. Systemd для пользователей Upstart ).
Вы можете запускать несколько команд из одного служебного файла, используя несколько строк ExecStart
:
[Service]
ExecStart=/some/command
ExecStart=/another/command some args
ExecStart=-/a/third/command ignore failure
Команда всегда должна вводиться с полный путь. Если какая-либо команда не работает, остальные не запускаются. A -
перед тем, как путь указывает systemd игнорировать ненулевой статус выхода (вместо того, чтобы считать это ошибкой).
Релевантно:
Для пользовательских сеансов вы можете вместо этого создать модуль systemd в ~ / .config / systemd
. Это должно работать с 16.04 и новее, но не с более ранними выпусками Ubuntu с systemd (так как они все еще использовали Upstart для пользовательских сеансов). Модулями пользовательского сеанса можно управлять с помощью тех же команд, что и с помощью системных служб, но с добавленной опцией - user
:
systemctl --user daemon-reload
systemctl --user status foo.service
Обратите внимание, что, в отличие от Upstart, systemd не запускает Exec *
команды через оболочку. Он сам выполняет ограниченное расширение переменных и несколько команд (разделенных ;
), но это все, что касается синтаксиса оболочки. Для чего-то более сложного, например перенаправления или каналов, заключите команду в sh -c '...'
или bash -c '...'
.
1 ] В отличие от долгоживущих демонов.
$ HOME / .config / autostart
содержит список запускаемых приложений. Файлы .desktop
в этой папке будут выполняться при запуске. Может потребоваться разрешение на выполнение ( chmod + x startup.desktop
).
Пример примера для файла .desktop
:
[Desktop Entry]
Type=Application
Exec="</path/to/script>"
Hidden=false
NoDisplay=false
X-GNOME-Autostart-enabled=true
Name=Startup Script
Здесь " path / to / script> "
заменяется на путь к вашему script.sh
Если вы поместите свой сценарий myscript
в / usr / local / bin
, чтобы его можно было запускать напрямую с помощью команды, вы можете написать myscript
вместо " path / to / script>"
.
Пример примера myscript.sh
:
#!/bin/bash
<commands to be executed>
exit
Результат:
.desktop
файл будет запущен из $ HOME / .config / autostart
, который выполнит сценарий по Exec =
Для этого нужно использовать upstart. Upstart используется для процессов Ubuntu, которые запускаются автоматически. Это усовершенствованное решение, как и старые скрипты System-V init.d. Оно также позволяет вставить предварительные условия для запуска вашего скрипта (т.е. нужна ли вам работающая сеть и т.д.)
cron
ответ реализован не так, как проголосовало наибольшее Этот ответ по-прежнему использует cron
, но использует другой метод, чем ответ, получивший наибольшее количество голосов. Это работает с Ubuntu 16.04, но, вероятно, поддерживалось гораздо раньше. Просто я начал использовать cron
для выполнения заданий при загрузке компьютера с 16.04.
cron
? В комментариях кто-то спросил «когда они запускаются? ". Вы можете указать в syslog / journalctl:
$ journalctl -b | grep cron
Jan 02 16:54:40 alien cron[919]: (CRON) INFO (pidfile fd = 3)
Jan 02 16:54:40 alien cron[919]: (CRON) INFO (Running @reboot jobs)
Jan 02 16:54:40 alien systemd[1]: Started Run anacron jobs.
Jan 02 16:54:40 alien anacron[949]: Anacron 2.3 started on 2018-01-02
Jan 02 16:54:40 alien anacron[949]: Normal exit (0 jobs run)
Jan 02 16:54:40 alien CRON[952]: pam_unix(cron:session): session opened for user root by (uid=0)
Jan 02 16:54:40 alien CRON[954]: pam_unix(cron:session): session opened for user root by (uid=0)
Jan 02 16:54:40 alien CRON[951]: pam_unix(cron:session): session opened for user root by (uid=0)
Jan 02 16:54:40 alien CRON[950]: pam_unix(cron:session): session opened for user root by (uid=0)
Jan 02 16:54:40 alien CRON[985]: (root) CMD ( /usr/local/bin/cron-reboot-cycle-grub-background)
Jan 02 16:54:40 alien CRON[954]: pam_unix(cron:session): session closed for user root
Jan 02 16:54:40 alien cron[919]: sendmail: Cannot open smtp.gmail.com:587
Jan 02 16:54:40 alien CRON[952]: pam_unix(cron:session): session closed for user root
Jan 02 16:54:40 alien cron[919]: sendmail: Cannot open smtp.gmail.com:587
Jan 02 16:54:40 alien CRON[950]: pam_unix(cron:session): session closed for user root
Следует отметить, что cron
может отправлять вам по электронной почте статус запущенных заданий, а @reboot
задания запускаются, поэтому ранний сетевой менеджер и электронная почта не будут быть запущенным, если вы не добавите команду sleep
в свои скрипты.
Поместите ваши скрипты в каталог /etc/cron.d
:
$ ll /etc/cron.d
total 44
drwxr-xr-x 2 root root 4096 Nov 26 19:53 ./
drwxr-xr-x 139 root root 12288 Dec 31 13:58 ../
-rw-r--r-- 1 root root 244 Dec 28 2014 anacron
-rw-r--r-- 1 root root 148 Feb 18 2017 cycle-grub-background
-rw-r--r-- 1 root root 138 Mar 5 2017 display-auto-brightness
-rw-r--r-- 1 root root 460 Nov 26 19:53 nvidia-hdmi-sound
-rw-r--r-- 1 root root 102 Feb 9 2013 .placeholder
-rw-r--r-- 1 root root 224 Nov 19 2016 touch-vmlinuz
-rw-r--r-- 1 root root 700 Aug 5 11:15 turn-off-hyper-threading
Вот несколько сценариев, которые я настроил для запуска при каждой загрузке:
$ cat /etc/cron.d/cycle-grub-background SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
@reboot root /usr/local/bin/cron-reboot-cycle-grub-background
$ cat /etc/cron.d/touch-vmlinuz
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
@reboot root touch "/boot/vmlinuz-"`uname -r`