如何在启动时运行脚本?

myu*_*uf3 659 startup autostart

如何在 Ubuntu 启动时自动运行脚本,以便在启动后不必手动运行它们?

cee*_*yoz 680

一种方法是添加一个@reboot cron任务:

  1. 运行crontab -e将允许您编辑您的 cron。
  2. 向其添加这样的行:

    @reboot /path/to/script
    
    Run Code Online (Sandbox Code Playgroud)

    将在您的计算机启动后执行该脚本。

  • `@reboot` 关键字是一个很好的提示,因为它并不广为人知。 (101认同)
  • @siamii:[`man 5 crontab`](http://manpages.ubuntu.com/manpages/precise/man5/crontab.5.html) 说`@reboot` 在启动时执行(当cron 守护进程启动时) . (26认同)
  • 好的。知道*确切时间*这会触发吗? (22认同)
  • 这太棒了。到目前为止,这似乎比 `rc.local` 更好,因为此时系统似乎设置得更多(PATH 等)。奇怪的是,在*系统启动之后很难调用某些东西.. (10认同)
  • 所以......如果我断电并且在电源恢复时PC再次转动,这将不会运行? (5认同)
  • @amphibient 可能您配置有误。`@reboot` 记录在此处:https://help.ubuntu.com/community/CronHowto (3认同)
  • 这在 Ubuntu 20.04.4 LTS 中对我不起作用 (3认同)
  • 遗憾的是,这在 20.04.2 中对我不起作用。我真的很难投反对票,因为这个答案并不适合所有人。 (3认同)
  • 我做了`sudo crontab -e`,然后向它添加了`@reboot /my/script`。当我只运行 `/my/script` 时,它工作正常 (2认同)

Las*_*sen 237

取决于您需要运行的脚本类型。对于服务等,您应该使用upstart。但是对于用户脚本,这些应该由 gnome 作为会话脚本启动!查看系统 > 首选项 > 启动应用程序。

附带说明一下,如果您需要在终端登录时运行一些脚本,您可以将它们添加到主目录中的.bash_login文件中。

14.04 及以上

一个简单的命令(一个不需要保持运行的命令)可以使用一个 Upstart 作业,例如:

start on startup
task
exec /path/to/command
Run Code Online (Sandbox Code Playgroud)

将其保存在一个.conf文件中/etc/init(如果您需要在系统启动时以 root 身份运行)或~/.config/upstart(如果您需要在登录时以用户身份运行)。

  • 考虑到 SO 和 StackExchange 的运行方式,您能否举一个新贵脚本的示例以及它的放置位置?这将使这成为一个更好的答案。您的链接说它没有得到维护并查看新贵食谱,这是 huuuge。我不知道从哪里开始。 (62认同)
  • upstart 已弃用(不支持,最后一次发布于 2014 年) (6认同)
  • 如果我需要以 root 身份运行命令怎么办? (4认同)
  • 请更新此答案以解释在运行 systemd 而不是 upstart (Ubuntu 15.04+) 的系统上要做什么。 (4认同)
  • 这个答案对我来说没有意义。`system->pref->startup applications` 中列出的应用程序在`/etc/init/` 和`~/.config/upstart` 中都找不到。那么*启动应用程序在哪里定义?* (4认同)
  • @dopatraman 答案指出,所有具有此功能的进程都以 root 身份运行。 (2认同)

pao*_*lim 201

您可以将命令添加到/etc/rc.local

sudo nano /etc/rc.local
Run Code Online (Sandbox Code Playgroud)

这将以 root 身份执行命令。

要以特定用户身份执行命令,请使用sudo -i -u(-i也可以运行登录 shell)。例如建立持久的SSH隧道,myhostjohndoes~/.ssh/config文件中定义:

sudo -i -u johndoe autossh -nNT -L 1234:localhost:1234 myhost
Run Code Online (Sandbox Code Playgroud)

请注意,如果/etc/rc.local不存在(如 Ubuntu 16.04 以来的情况),您需要在顶部添加一个shebang 行(例如#!/bin/bash),并确保该文件是可执行的:

sudo chmod a+x /etc/rc.local
Run Code Online (Sandbox Code Playgroud)

  • 这最直接地回答了这个问题:如何在系统启动时简单地执行一些脚本。upstart 做了一个更复杂的任务:启动守护进程。 (24认同)
  • 应该是?现在这不再有效了,对吧? (6认同)
  • 请注意,如果您自己制作这个文件(就像我所做的那样),那么您必须使用 `chmod 755 rc.local` 将文件更改为可执行文件,并将 `#!/bin/bash` 添加到第一行。 (5认同)
  • 不支持 Ubuntu 17.04 systemd (4认同)
  • 这应该是公认的答案 (2认同)

mur*_*uru 129

对于 15.04 及更高版本:

要在启动时使用运行(短暂的)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
Run Code Online (Sandbox Code Playgroud)

然后运行:

sudo systemctl daemon-reload
sudo systemctl enable foo.service
Run Code Online (Sandbox Code Playgroud)

本质上,这只是将典型的 Upstart 作业转换为 systemd作业(请参阅Systemd for Upstart 用户)。

您可以使用多ExecStart行从同一个服务文件运行多个命令:

[Service]
ExecStart=/some/command
ExecStart=/another/command some args
ExecStart=-/a/third/command ignore failure
Run Code Online (Sandbox Code Playgroud)

命令必须始终与完整路径一起给出。如果任何命令失败,则其余命令不会运行。-路径前的A告诉 systemd 忽略非零退出状态(而不是将其视为失败)。

相关的:


对于用户会话,您可以在其中创建 systemd 单元~/.config/systemd。这应该适用于 16.04 及以后的版本,但不适用于带有 systemd 的早期版本的 Ubuntu(因为那些仍然使用 Upstart 进行用户会话)。可以使用与系统服务相同的命令来控制用户会话单元,但--user添加了以下选项:

systemctl --user daemon-reload
systemctl --user status foo.service
Run Code Online (Sandbox Code Playgroud)

Shell 语法

请注意,与 Upstart 不同的是,systemd 不会Exec*通过 shell运行命令。它自己执行一些有限的变量扩展和多个命令(由 分隔;),但就类似 shell 的语法而言,仅此而已。对于任何更复杂的事情,比如重定向或管道,请将您的命令包装在sh -c '...'或 中bash -c '...'


1与长期存在的守护进程相反。


Ric*_*rri 75

有多种方法可以自动运行命令:

  1. 新贵系统将执行从它发现在目录中配置的所有脚本/etc/init。这些脚本将在系统启动期间运行(或响应某些事件,例如关闭请求),因此是运行不与用户交互的命令的地方;所有服务器都使用这种机制启动。

    您可以在以下位置找到可读的介绍:http : //upstart.ubuntu.com/getting-started.html手册页man 5 initman 8 init为您提供完整的详细信息。

  2. .gnomerc每次登录到 GNOME 会话时,都会自动获取在您的主目录中命名的 shell 脚本。您可以在其中放置任意命令;您在此脚本中设置的环境变量将被您在会话中运行的任何程序看到。

    请注意,在.gnomerc脚本完成之前会话不会开始;因此,如果你想自动启动一些长时间运行的程序,你需要附加&到程序调用中,以便将它与正在运行的 shell 分离。

  3. 菜单选项System -> Preferences -> Startup Applications允许您定义在图形会话启动时应该启动哪些应用程序(Ubuntu 预定义了很多),并根据您的喜好添加或删除它们。这与.gnomerc脚本的目的和范围几乎相同,只是您不需要知道sh语法(但您也不能使用任何sh编程结构)。

  • 3) “这与 .gnomerc 脚本的目的和范围几乎相同”,除了 `.gnomerc` 显然在 *** 加载 Unity 之前运行,而 `启动应用程序` 显然在 *** 加载之后运行统一。我不得不运行一个位于 Unity 菜单栏上的程序,它在这种情况下产生了巨大的不同! (11认同)

Pan*_*dya 37

$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
Run Code Online (Sandbox Code Playgroud)

这里"</path/to/script>"替换为你的路径script.sh 如果你把你的脚本myscript放在里面/usr/local/bin以便它可以直接通过命令执行,你可以写myscript而不是"</path/to/script>".

示例示例myscript.sh

#!/bin/bash
<commands to be executed>
exit
Run Code Online (Sandbox Code Playgroud)

结果: .desktop将启动文件,$HOME/.config/autostart从中执行脚本Exec=


tut*_*uca 19

对于简单的事情,您可以在System->Preferences->Sessions 中添加一个指向脚本位置的命令。

或者,您可以将它添加到 /etc/init.d/rc.local 或制作一个新贵的工作,如果它是一个更底层的东西。

查看https://help.ubuntu.com/community/UbuntuBootupHowto了解更多信息


Win*_*nix 9

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
Run Code Online (Sandbox Code Playgroud)

需要注意的一件事是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
Run Code Online (Sandbox Code Playgroud)

脚本是什么样子的?

以下是我设置的几个脚本来运行每次启动:

$ 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`
Run Code Online (Sandbox Code Playgroud)

  • 哦拜托。你我都知道编辑器是可以改变的。 (2认同)

txw*_*ger 5

您应该为此使用暴发户。Upstart 用于自动启动的 Ubuntu 进程。它是一个增强的解决方案,类似于旧的 System-V init.d 脚本。它还允许您在脚本开始时加入先决条件(即您是否需要运行网络?等)

  • 公众支持截至 2021 年 4 月 (3认同)