Ubuntu启动时如何自动运行脚本,因此启动后不必手动运行脚本?

评论

如果有人还可以同时显示“时间”和“地点”,那就太好了。我之所以这样说,是因为我知道至少有两种方法可以启动在其他应用程序启动之前就可以启动的脚本(例如X11)

整个答案线程都是一团糟。 Stack Exchange格式似乎并非最适合此问题

+1到@GabrielFair。问题的很大一部分是原始问题和答案已有十年历史了。我还要补充说,有太多方法可以解决此问题。 Unix哲学的简单性发生了什么?要求知识渊博且有足够知识的人重写这篇文章,或为现代os版本添加新的,最新的权威性答案。

#1 楼

根据您需要运行的脚本类型而定。对于服务等,您应该使用upstart。但是对于用户脚本,它们应该由gnome作为会话脚本启动!在“系统”>“首选项”>“启动应用程序”下查看。
如果需要在终端登录时运行某些脚本,则可以将其添加到主目录中的.bash_login文件中。
对于14.04及更早版本
一个简单的命令(不需要保持运行状态)可以使用Upstart作业,例如:在系统启动时以root用户身份运行),或者在.conf中运行(如果需要它,
以便在登录时以用户身份运行)。

评论


考虑到SO和StackExchange的运行方式,您能否举一个新贵脚本的示例以及放置位置?那将使它成为一个更好的答案。您的链接说它没有得到维护,请查看新贵的菜谱,这是很麻烦的。我对从哪里开始没有太多的想法。

– Ehtesh Choudhury
13年2月4日在4:03

如果我需要以root用户身份运行命令怎么办?

–多巴特拉曼
15年7月15日在1:58

@dopatraman答案指出所有与此相关的进程都以root身份运行。

–AStopher
15-10-24在11:43

请更新此答案,以解释在运行systemd而不是新贵(Ubuntu 15.04+)的系统上该怎么做。

–user364819
16年1月9日在18:52

这个答案对我来说没有意义。在/ etc / init /或〜/ .config / upstart中都找不到system-> pref-> startup应用程序中列出的应用程序。那么启动应用程序在哪里定义?

– phil294
16年8月7日在17:49

#2 楼

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


运行crontab -e将允许您编辑cron。

在其上添加如下一行:

@reboot /path/to/script


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



评论


@reboot关键字是一个很好的提示,因为它并不广为人知。

–弥撒教
2010年8月11日下午13:39

真好确切知道何时触发?

–奥利♦
2011年2月2日,13:54

所以...如果我断电并且恢复供电后PC再次打开,这将无法运行?

–迈克·威尔斯(Mike Wills)
2012年6月21日19:27

@siamii:man 5 crontab表示@reboot在启动时执行(启动cron守护程序时)。

– jfs
13年3月29日在16:04

这太棒了。到目前为止,这似乎比rc.local更好,因为到这一点为止,系统似乎已进行了更多设置(PATH等)。奇怪的是,系统启动后很难调用某些东西。

– Karthik T
13年10月10日在7:17

#3 楼

您可以向/etc/rc.local添加命令:
sudo nano /etc/rc.local

这将以root用户身份执行命令。例如,要建立一个持久的SSH隧道,其中在sudo -i -u-i文件中定义了myhost:在顶部添加一个shebang行(例如johndoe),并确保文件是可执行的:
sudo -i -u johndoe autossh -nNT -L 1234:localhost:1234 myhost


评论


这最直接地回答了以下问题:如何在系统启动时简单地执行一些脚本。 upstart执行的任务更加复杂:启动守护进程。

–狗狗天气
13年8月7日在19:01

那么upstart启动守护进程,而/etc/rc.local启动bash脚本吗?

–多纳托
15年5月10日在18:51

应该是?这些天不再有效了,对吧?

–戴文斯
17年4月28日在8:29

不适用于Ubuntu 17.04 systemd

–qodeninja
17年8月1日,下午3:58

请注意,如果您像我一样自己制作此文件,则必须使用chmod 755 rc.local将文件更改为可执行文件,并在第一行中添加#!/ bin / bash。

–psitae
17年8月2日在16:42



#4 楼

对于15.04及更高版本:
要在启动时使用systemd运行(短期)1命令,可以使用OneShot类型的systemd单元。例如,创建包含以下内容的/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忽略非零退出状态(而不是将其视为失败)。
相关:

systemd上的Arch Wiki条目/>

对于用户会话,您可以改为在man 5 systemd.service中创建systemd单元。此版本应在16.04及更高版本上运行,但不适用于具有systemd的Ubuntu早期版本(因为这些版本仍在用户会话中使用Upstart)。可以使用与系统服务相同的命令来控制用户会话单元,但是添加了~/.config/systemd选项:
systemctl --user daemon-reload
systemctl --user status foo.service


Shell语法
请注意,与Upstart不同,systemd不会t通过外壳运行--user命令。它本身执行一些有限的变量扩展和多个命令(由Exec*分隔),但是就象Shell语法一样就可以了。对于更复杂的事情,例如重定向或管道,请将命令包装在;sh -c '...'中。

1与长期存在的守护程序相对。

评论


是否可以为工作设定优先级?还是指定它首先依赖于另一个服务?

– r3wt
17年4月25日在0:38

@ r3wt是的,有不同的方法可以做到这一点。例如,此处使用的WantedBy使它在到达multi-user.target时启动。您可以使用Before,After,Requires等。请参见man systemd.unit

–muru
18年1月3日在6:07

@PerlDuck并不是唯一缺少的东西。谢谢!

–muru
18 Mar 5 '18 at 13:53

别客气。 —顺便说一句,RemainAfterExit取决于您启动的服务及其所需的行为。例如,/ bin / df -h 应具有RemainAfterExit = no。

– PerlDuck
18 Mar 5 '18 at 14:19

@PerlDuck df中没有固有的东西需要RemainAfterExit = no。除非您希望每次运行systemctl start foo时都重复执行该命令。

–muru
18 Mar 5 '18 at 14:32

#5 楼

有多种自动运行命令的方式:


新贵系统将执行所有脚本,并从中找到目录/etc/init中的配置。这些脚本将在系统启动期间运行(或响应某些事件,例如关闭请求),因此可以运行不与用户交互的命令。所有服务器都使用此机制启动。
您可以在以下位置找到可读的介绍:http://upstart.ubuntu.com/getting-started.html手册页man 5 initman 8 init提供了完整的详细信息。.gnomerc的shell脚本。您可以在其中放置任意命令。您在会话中运行的任何程序都将看到在此脚本中设置的环境变量。
请注意,直到.gnomerc脚本完成后,会话才开始;因此,如果要自动启动一些长时间运行的程序,则需要在程序调用后附加&,以便将其与正在运行的外壳分离。


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



评论


3)“这具有与.gnomerc脚本几乎相同的目的和范围”,除了.gnomerc显然在加载Unity之前运行,而Startup Applications显然在加载Unity之后运行。我必须运行一个位于Unity菜单栏上的程序,在这种情况下,它起了很大的作用!

–巴西那个家伙
13年1月23日在16:13



@ ruda.almeida感谢您指出这一点。答案是在统一之前写的。

–里卡多·穆里(Riccardo Murri)
13年1月23日在16:48

sudo update-rc.d myscript.sh的默认值(其中/etc/init.d/myscript.sh是您的脚本)也在启动时运行。

– Dan Dascalescu
16年8月9日在6:16

#6 楼

$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=执行脚本

评论


在Ubuntu 18.04上不起作用。 $ HOME / .config / autostart仅包含一个保管箱文件,该文件不能执行。

– MERose
1月24日7:26

在Ubuntu 18.04.1。上为我工作。顺便说一句。我通过搜索->启动应用程序添加了桌面条目。结果是完全一样的。

–父亲之栈
3月3日,11:10

#7 楼

为了简单起见,您可以在“系统”->“首选项”->“会话”中添加指向脚本位置的命令。

您也可以将其添加到/etc/init.d/rc.local或如果是比较低级的工作,那就是新贵。

请参阅https://help.ubuntu.com/community/UbuntuBootupHowto了解更多信息

#8 楼


cron实现的答案与最高投票的答案不同
此答案仍使用cron,但使用的方法与最高投票的答案不同。自Ubuntu 16.04起可以使用,但可能支持得更快。仅仅是从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可以通过电子邮件向您发送作业的运行状态和cron作业的运行,因此早期的网络管理员和电子邮件将不会运行,除非您输入@reboot命令放入脚本。
将脚本放在哪里
将脚本放在目录sleep中:
$ 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`


评论


添加cronjobs的方式有很多种,但是投票率很高的答案的核心,而您的答案仍然是@reboot。

–muru
18年1月3日,下午5:40

添加crontab的替代方法应发布到askubuntu.com/q/2368/158442,这显然是有关添加Cron作业的信息。

–muru
18年1月3日,下午5:47

我不敢苟同。有问题的答案的核心是使用crontab -e,由于类似于vim的界面,有些人认为这是妖术之一。另一方面,这个答案可能会吸引那些大脑以某种方式连接的人。我们并非都来自同一模具。再说一次,这个答案已经被否决了,所以我们让民主走她的路。

–WinEunuuchs2Unix
18年1月3日,下午5:58

哦拜托。您和我都知道可以更改编辑器。

–muru
18年1月3日,下午5:59

这比高度投票的答案要清楚得多。每个答案都有数百条评论说“不起作用”,因为此任务比原始帖子所建议的更加微妙。

–apkg
3月8日8:03



#9 楼

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