Как я могу запускать скрипты автоматически при запуске Ubuntu, чтобы мне не приходилось запускать их вручную после запуска?
Как я могу запускать скрипты автоматически при запуске Ubuntu, чтобы мне не приходилось запускать их вручную после запуска?
Ответы:
В зависимости от того, какие скрипты вам нужно запускать. Для сервисов и тому подобного вы должны использовать upstart . Но для пользовательского сценария они должны запускаться gnome как сценарии сеанса! Загляните в «Система»> «Настройки»> «Запуск приложений».
Кроме того, если вам нужно запустить некоторые скрипты при входе в систему с терминала, вы можете добавить их в файл .bash_login в вашем домашнем каталоге.
Простая команда (которая не должна оставаться запущенной) может использовать задание Upstart, например:
start on startup
task
exec /path/to/command
Сохраните это в .conf
файле /etc/init
(если вам нужно, чтобы он запускался от имени root при загрузке системы), или в ~/.config/upstart
(если вам нужно, чтобы он работал от имени пользователя при входе в систему).
system->pref->startup applications
могут быть найдены /etc/init/
ни в, ни в ~/.config/upstart
. Так, где определены приложения запуска?
Одним из подходов является добавление задачи @reboot cron :
crontab -e
позволит вам редактировать свой хрон.Добавляем к нему такую строку:
@reboot /path/to/script
выполнит этот скрипт после загрузки вашего компьютера.
@reboot
Ключевое слово хороший наконечник , потому что это не так широко известны.
man 5 crontab
говорит, что @reboot
выполняется при запуске (при запуске демона cron).
rc.local
когда система кажется более настроенной к этому моменту (PATH и т. Д.). Странно, что так сложно что-то назвать после запуска системы ..
Как насчет добавления команды в /etc/rc.local
? вам придется использовать доступ sudo, хотя для редактирования этого файла.
sudo nano /etc/rc.local
chmod 755 rc.local
и добавить #!/bin/bash
в первую строку.
Чтобы выполнить (недолговечную) команду 1 при запуске с помощью 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
Команда всегда должна указываться с полным путем. Если какая-либо команда не выполняется, остальные не запускаются. Перед -
тем, как путь указывает 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 В отличие от долгоживущих демонов.
WantedBy
Здесь используется, например, позволяет начать , когда multi-user.target
достигается. Вы можете использовать Before
, After
, Requires
и т.д. Смman systemd.unit
RemainAfterExit
зависит от того, какую службу вы запускаете и от какого поведения. Например, /bin/df -h
<s> бы </ s> должен был иметь RemainAfterExit=no
.
df
этим потребностям RemainAfterExit=no
. Если вы не хотите многократно выполнять команду при каждом запуске systemctl start foo
.
Существуют разные способы автоматического запуска команд:
Система upstart выполнит все сценарии, из которых она найдет конфигурацию в каталоге /etc/init
. Эти сценарии будут запускаться во время запуска системы (или в ответ на определенные события, например, запрос на выключение), и поэтому являются местом для запуска команд, которые не взаимодействуют с пользователем; все серверы запускаются с использованием этого механизма.
Вы можете найти читаемое введение по адресу: http://upstart.ubuntu.com/getting-started.html справочные страницы man 5 init
и man 8 init
дать вам полную информацию.
Сценарий оболочки, указанный .gnomerc
в вашем домашнем каталоге, автоматически создается при каждом входе в сеанс GNOME. Вы можете поместить произвольные команды там; Переменные окружения, которые вы установили в этом скрипте, будут видны любой программе, запущенной в вашем сеансе.
Обратите внимание, что сессия не начинается, пока .gnomerc
скрипт не завершится; следовательно, если вы хотите автоматически запустить какую-то долго работающую программу, вам нужно добавить &
ее в вызов программы, чтобы отсоединить ее от работающей оболочки.
Пункт меню « Система» -> «Настройки» -> «Запуск приложений» позволяет определить, какие приложения следует запускать при запуске графического сеанса (Ubuntu предопределяет довольно много), а также добавлять или удалять их по своему вкусу. Это имеет почти то же самое назначение и область действия .gnomerc
сценария, за исключением того, что вам не нужно знать sh
синтаксис (но вы также не можете использовать какую-либо sh
программную конструкцию).
.gnomerc
очевидно, запускается до загрузки Unity и, Startup Applications
очевидно, запускается после загрузки Unity. Мне пришлось запустить программу, которая находится в строке меню Unity, и это имело огромное значение в этом случае!
sudo update-rc.d myscript.sh defaults
где /etc/init.d/myscript.sh - ваш скрипт, также запускает его при запуске.
$HOME/.config/autostart
.desktop
Здесь можно поместить файл, который будет выполнен при запуске.Пример примера для .desktop
файла:
Поместить следующий .desktop
файл в $HOME/.config/autostart
и дано chmod +x
:
[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
(обычно рекомендуется /usr/local/bin
так, что может быть выполнен непосредственно командой скажем, myscript
заменен на "</path/to/script>"
).
Пример примера script.sh
:
#!/bin/bash
<commands to be executed>
exit
Результат:
.desktop
файл будет запущен из $HOME/.config/autostart
которого выполнить скриптExec=
Следовательно, вы можете запустить желаемый сценарий оболочки при запуске!
Для простых вещей вы можете добавить команду System-> Preferences-> Sessions, указывающую местоположение вашего скрипта.
В качестве альтернативы вы можете добавить его в /etc/init.d/rc.local или сделать выскочку, если это материал более низкого уровня .
Посмотрите https://help.ubuntu.com/community/UbuntuBootupHowto для получения дополнительной информации
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`
@reboot
.
crontab -e
что некоторые считают одним из черных искусств из-за vim-подобного интерфейса. С другой стороны, этот ответ может понравиться тем, чей мозг подключен определенным образом. Мы не все отлиты из одной и той же формы. С другой стороны, этот ответ уже имеет один отрицательный голос, поэтому мы позволим демократии пойти своим путем.
crontab -e
, вспоминает звездочки ("*") на минуты, часы и т. Д., Которые я всегда находил, для которых мне нужны инструкции Google. Я все еще нахожу использование /etc/cron.d
и /etc/cron.daily
мой выбор. Тем более, что это зеркала /etc/udev/rules.d
и /etc/systemd/system-sleep
методы. Это просто кажется хорошей подгонкой.
Вы должны использовать выскочку для этого. Upstart используется для процессов Ubuntu, которые запускаются автоматически. Это улучшенное решение, подобное старым сценариям System-V init.d. Это также позволяет вам поставить предварительные условия для запуска вашего скрипта (т.е. вам нужна работающая сеть? И т. Д.)