Как запустить цикл while при запуске системы? [dубликат]

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

http://cdimage.ubuntu.com/daily-live/current/

] Хорошо работает здесь с Skylake (520)

Если Intel прекрасна, то nvidia должна быть хорошей на настольных компьютерах, но разрывание будет разрастаться на nvidia-prime / optimus.

В этом случае единственное решение - перейти к 16.04 сейчас или позже. Я бы пошел сейчас, так как 15.04 / 15.10 - это всего лишь моментальные выпуски с небольшим количеством исправлений ошибок в конце дня и amp; например,

462
задан 23 November 2016 в 23:22

16 ответов

Существуют различные способы автоматического запуска команд:

Система выскочки выполнит все сценарии, из которых она находит конфигурацию в каталоге /etc/init. Эти сценарии будут запускаться во время запуска системы (или в ответ на определенные события, например, запрос на завершение), а также место для запуска команд, которые не взаимодействуют с пользователем; все серверы запускаются с использованием этого механизма. Вы можете найти читаемое введение на странице http://upstart.ubuntu.com/getting-started.html man-страницы man 5 init и man 8 init, чтобы получить полную информацию. Сценарий оболочки с именем .gnomerc в вашем домашнем каталоге автоматически создается при каждом входе в сеанс GNOME. Вы можете помещать в него произвольные команды; переменные среды, установленные в этом скрипте, будут видны любой программой, которую вы запускаете в своем сеансе. Обратите внимание, что сеанс не запускается до завершения скрипта .gnomerc; поэтому, если вы хотите автозапускать какую-то давно действующую программу, вам нужно добавить & к вызову программы, чтобы отделить ее от рабочей оболочки. Параметр меню «Система» -> «Настройки» -> «Приложения для запуска» позволяет определить, какие приложения следует запускать при запуске графического сеанса (Ubuntu предопределяет некоторые из них) и добавлять или удалять их на свой вкус. Это имеет почти ту же цель и объем сценария .gnomerc, за исключением того, что вам не нужно знать синтаксис sh (но вы также не можете использовать любую конструкцию программирования sh).
68
ответ дан 17 July 2018 в 18:24

Для 15.04 и более поздних версий:

Чтобы запустить команду (кратковременно) 1 при запуске с помощью systemd, вы можете использовать unitd unit типа 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 for (!).

Вы можете запускать несколько команд из одного и того же файла службы, используя несколько строк ExecStart:

[Service] ExecStart=/some/command ExecStart=/another/command some args ExecStart=-/a/third/command ignore failure

Команда всегда должна указываться с полным путем. Если какая-либо команда выходит из строя, остальные не запускаются. [[8]]

Релевантно:

Запись в Arch Wiki на systemd man 5 systemd.service Релевантно:

Вместо сеансов пользователя вы можете создать блок systemd в ~/.config/systemd. Это должно работать с 16.04 и далее, но не более ранними версиями Ubuntu с systemd (так как они все еще использовали Upstart для пользовательских сеансов). Устройства сеанса пользователя можно управлять с помощью тех же команд, что и с системными службами, но с добавленной опцией --user:

systemctl --user daemon-reload systemctl --user status foo.service

1 As против долгоживущих демонов.

50
ответ дан 17 July 2018 в 18:24
$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 так: это может быть выполнено непосредственно командой say myscript заменено на "</path/to/script>").

Пример примера script.sh ]:

#!/bin/bash <commands to be executed> exit

Результат: файл .desktop будет запущен из $HOME/.config/autostart, который выполняет скрипт Exec=

Следовательно, вы можете запустите нужный сценарий оболочки при запуске!

22
ответ дан 17 July 2018 в 18:24

Как добавить команду в /etc/rc.local? вам нужно будет использовать sudo-доступ, но для редактирования этого файла.

sudo nano /etc/rc.local
126
ответ дан 17 July 2018 в 18:24

Для простых вещей вы можете добавить команду в System-> Preferences-> Sessions, указывающую на местоположение вашего скрипта.

В качестве альтернативы вы можете добавить его в /etc/init.d/rc.local или выполнить выскочку, если это больше System-> Preferences-> Sessions .

Взгляните на upstart для получения дополнительной информации

18
ответ дан 17 July 2018 в 18:24

Вы должны использовать выскочку для этого. Upstart используется для процессов Ubuntu, которые автоматически запускаются. Это расширенное решение, такое как старые скрипты init.d System-V. Он также позволяет вам установить предварительные условия для начала вашего скрипта (т. Е. Вам нужна работа в сети? И т. Д.)

5
ответ дан 17 July 2018 в 18:24

Один из подходов состоит в том, чтобы добавить задачу @reboot cron:

Запуск crontab -e позволит вам редактировать ваш cron. Добавьте к нему такую ​​строку: @reboot /path/to/script выполнит этот сценарий после загрузки вашего компьютера.
460
ответ дан 17 July 2018 в 18:24

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`
3
ответ дан 17 July 2018 в 18:24

Существуют различные способы автоматического запуска команд:

Система выскочки выполнит все сценарии, из которых она находит конфигурацию в каталоге /etc/init. Эти сценарии будут запускаться во время запуска системы (или в ответ на определенные события, например, запрос на завершение), а также место для запуска команд, которые не взаимодействуют с пользователем; все серверы запускаются с использованием этого механизма. Вы можете найти читаемое введение на странице http://upstart.ubuntu.com/getting-started.html man-страницы man 5 init и man 8 init, чтобы получить полную информацию. Сценарий оболочки с именем .gnomerc в вашем домашнем каталоге автоматически создается при каждом входе в сеанс GNOME. Вы можете помещать в него произвольные команды; переменные среды, установленные в этом скрипте, будут видны любой программой, которую вы запускаете в своем сеансе. Обратите внимание, что сеанс не запускается до завершения скрипта .gnomerc; поэтому, если вы хотите автозапускать какую-то давно действующую программу, вам нужно добавить & к вызову программы, чтобы отделить ее от рабочей оболочки. Параметр меню «Система» -> «Настройки» -> «Приложения для запуска» позволяет определить, какие приложения следует запускать при запуске графического сеанса (Ubuntu предопределяет некоторые из них) и добавлять или удалять их на свой вкус. Это имеет почти ту же цель и объем сценария .gnomerc, за исключением того, что вам не нужно знать синтаксис sh (но вы также не можете использовать любую конструкцию программирования sh).
68
ответ дан 23 July 2018 в 19:12
  • 1
    3) «Это имеет почти ту же цель и масштаб сценария .gnomerc», за исключением .gnomerc, по-видимому, выполняется перед загрузкой Unity, а Startup Applications, по-видимому, работает до [ ! d1] loading Unity. Мне пришлось запустить программу, которая находится на панели меню Unity, и в этом случае это имело огромное значение! – That Brazilian Guy 23 January 2013 в 22:13
  • 2
    @ ruda.almeida Спасибо, что указали это. Ответ был написан в дни доединства. – Riccardo Murri 23 January 2013 в 22:48
  • 3
    sudo update-rc.d myscript.sh defaults, где /etc/init.d/myscript.sh - ваш скрипт, также запускает его при запуске. – Dan Dascalescu 9 August 2016 в 09:16

Для 15.04 и более поздних версий:

Чтобы запустить команду (кратковременно) 1 при запуске с помощью systemd, вы можете использовать unitd unit типа 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 for (!).

Вы можете запускать несколько команд из одного и того же файла службы, используя несколько строк ExecStart:

[Service] ExecStart=/some/command ExecStart=/another/command some args ExecStart=-/a/third/command ignore failure

Команда всегда должна указываться с полным путем. Если какая-либо команда выходит из строя, остальные не запускаются. [[8]]

Релевантно:

Запись в Arch Wiki на systemd man 5 systemd.service Релевантно:

Вместо сеансов пользователя вы можете создать блок systemd в ~/.config/systemd. Это должно работать с 16.04 и далее, но не более ранними версиями Ubuntu с systemd (так как они все еще использовали Upstart для пользовательских сеансов). Устройства сеанса пользователя можно управлять с помощью тех же команд, что и с системными службами, но с добавленной опцией --user:

systemctl --user daemon-reload systemctl --user status foo.service

1 As против долгоживущих демонов.

51
ответ дан 23 July 2018 в 19:12
  • 1
    Учитывая, как работает SO и StackExchange, не могли бы вы привести пример сценария выскочки и где он будет размещен? Это сделало бы это гораздо лучшим ответом. В вашей ссылке говорится, что ее не поддерживают и смотрят на поваренную книгу с выскочкой, которая является huuuge. У меня нет слишком большой идеи, с чего начать. – Ehtesh Choudhury 4 February 2013 в 10:03
  • 2
    Что делать, если мне нужно запустить команду как root? – dopatraman 15 July 2015 в 04:58
  • 3
    @dopatraman В ответе говорится, что все процессы с этим выполняются как root. – cybermonkey 24 October 2015 в 14:43
  • 4
    Обновите этот ответ, чтобы объяснить, что делать с системами, работающими systemd, а не с выскочкой (Ubuntu 15.04+). – user 9 January 2016 в 22:52
  • 5
    Этот ответ для меня не имеет смысла. Приложения, перечисленные в system->pref->startup applications, не могут быть найдены в /etc/init/ или в ~/.config/upstart. Итак, , где определены приложения запуска? – Blauhirn 7 August 2016 в 20:49
  • 6
    можно ли задать приоритет на задание? или указать, что это зависит от другой службы, которая должна быть запущена в первую очередь? – r3wt 25 April 2017 в 03:38
  • 7
    @ r3wt да, есть разные способы сделать это. Используемый здесь WantedBy, например, запускает его при достижении multi-user.target. Вы можете использовать Before, After, Requires и т. Д. См. [D0] man systemd.unit – muru 3 January 2018 в 10:07
  • 8
    @PerlDuck не единственное, чего не хватало. Благодаря! – muru 5 March 2018 в 17:53
  • 9
    Пожалуйста. - Btw, RemainAfterExit зависит от запуска службы и ее желаемого поведения. Например, /bin/df -h & lt; s & gt; будет & lt; / s & gt; должен иметь RemainAfterExit=no. – PerlDuck 5 March 2018 в 18:19
  • 10
    @PerlDuck В df нет ничего, что нужно RemainAfterExit=no. Если вы не хотите повторно выполнять команду каждый раз при запуске systemctl start foo. – muru 5 March 2018 в 18:32
$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 так: это может быть выполнено непосредственно командой say myscript заменено на "</path/to/script>").

Пример примера script.sh ]:

#!/bin/bash <commands to be executed> exit

Результат: файл .desktop будет запущен из $HOME/.config/autostart, который выполняет скрипт Exec=

Следовательно, вы можете запустите нужный сценарий оболочки при запуске!

22
ответ дан 23 July 2018 в 19:12

Как добавить команду в /etc/rc.local? вам нужно будет использовать sudo-доступ, но для редактирования этого файла.

sudo nano /etc/rc.local
127
ответ дан 23 July 2018 в 19:12
  • 1
    Это наиболее непосредственно отвечает на вопрос: как просто выполнять некоторые скрипты, когда ваша система загружается. upstart выполняет более сложную задачу: запускает процессы демона. – Dogweather 8 August 2013 в 00:01
  • 2
    Итак, upstart запускает процессы демона, в то время как /etc/rc.local запускает скрипты bash? – Donato 10 May 2015 в 21:51
  • 3
    Это должен быть принятый ответ ... – Android Dev 23 November 2016 в 23:23
  • 4
    Должно ли это? Это уже не работает в наши дни, верно? – DaVince 28 April 2017 в 11:29
  • 5
    Не работает с Ubuntu 17.04 systemd – qodeninja 1 August 2017 в 06:58

Для простых вещей вы можете добавить команду в System-> Preferences-> Sessions, указывающую на местоположение вашего скрипта.

В качестве альтернативы вы можете добавить его в /etc/init.d/rc.local или выполнить выскочку, если это больше System-> Preferences-> Sessions .

Взгляните на upstart для получения дополнительной информации

18
ответ дан 23 July 2018 в 19:12

Вы должны использовать выскочку для этого. Upstart используется для процессов Ubuntu, которые автоматически запускаются. Это расширенное решение, такое как старые скрипты init.d System-V. Он также позволяет вам установить предварительные условия для начала вашего скрипта (т. Е. Вам нужна работа в сети? И т. Д.)

5
ответ дан 23 July 2018 в 19:12

Один из подходов состоит в том, чтобы добавить задачу @reboot cron:

Запуск crontab -e позволит вам редактировать ваш cron. Добавьте к нему такую ​​строку: @reboot /path/to/script выполнит этот сценарий после загрузки вашего компьютера.
462
ответ дан 23 July 2018 в 19:12
  • 1
    Ключевое слово @reboot - хороший отзыв, потому что он не широко известен. – jathanism 11 August 2010 в 18:39
  • 2
    Ницца. Любая идея точно, когда это срабатывает? – Oli♦ 2 February 2011 в 17:54
  • 3
    Итак ... это не сработает, если я потеряю питание, и компьютер снова вернется, когда будет восстановлена ​​мощность? – Mike Wills 22 June 2012 в 00:27
  • 4
    @siamii: man 5 crontab говорит, что @reboot выполняется при запуске (когда запущен cron-демон). – jfs 29 March 2013 в 22:04
  • 5
    Это круто. Пока это кажется лучше, чем rc.local, поскольку система кажется более настроенной к этому моменту (PATH и т. Д.). Странно, что так сложно вызвать что-то после запуска системы . – Karthik T 10 October 2013 в 12:17

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`
3
ответ дан 23 July 2018 в 19:12
  • 1
    Существует много разных способов добавления cronjobs, но ядро ​​ответа с высоким разрешением и ваш ответ по-прежнему остаются @reboot. – muru 3 January 2018 в 09:40
  • 2
    Альтернативные методы добавления crontabs должны быть отправлены на askubuntu.com/q/2368/158442 , что явно связано с добавлением заданий Cron. – muru 3 January 2018 в 09:47
  • 3
    Позволю себе не согласиться. В основе рассматриваемого ответа используется crontab -e, который некоторые считают одним из черных искусств из-за виртуального интерфейса. С другой стороны, этот ответ может понравиться тем, чьи мозги связаны определенным образом. Мы не все отлиты из той же формы. И снова этот ответ уже имеет один голос, поэтому мы позволим демократии пройти курс. – WinEunuuchs2Unix 3 January 2018 в 09:58
  • 4
    О, пожалуйста. Мы с вами знаем, что редактор можно изменить. – muru 3 January 2018 в 09:59
  • 5
    @muru Да, возможно, потому, что вы научили меня, и я научился менять редактор на что-то вроде nano или на пару других CLI. Но я в лагере гедитов. Кроме того, crontab -e вызывает воспоминания о звездочке («*») в течение минут, часов и т. Д., Которые я всегда обнаружил, для чего мне нужны инструкции Google. Я все еще нахожу использование /etc/cron.d и /etc/cron.daily моего выбора. Тем более, что он отражает методы /etc/udev/rules.d и /etc/systemd/system-sleep. Просто кажется, что это хорошо. – WinEunuuchs2Unix 3 January 2018 в 10:09

Другие вопросы по тегам:

Похожие вопросы: