如何在启动时运行脚本?
如何在Ubuntu启动时自动运行脚本,这样我就不必在启动后手动运行它们了?
取决于您需要运行的脚本类型..对于服务等,您应该使用upstart 。 但对于用户脚本,这些应该由gnome作为会话脚本启动! 在System> Preferences> Startup Applications下查看。
另外,如果您需要在终端登录时运行某些脚本,可以将它们添加到主目录中的.bash_login文件中。
14.04及以上
一个简单的命令(一个不需要保持运行的命令)可以使用Upstart作业,如:
start on startup task exec /path/to/command
将其保存在/etc/init
中的.conf
文件中(如果需要在系统启动时以root身份运行),或者在~/.config/upstart
(如果需要它在登录时以用户身份运行) )。
一种方法是添加@reboot cron任务:
- 运行
crontab -e
将允许您编辑您的cron。 -
添加这样的行:
@reboot /path/to/script
将在您的计算机启动后执行该脚本。
如何将命令添加到/etc/rc.local
? 你必须使用sudo访问来编辑这个文件。
sudo nano /etc/rc.local
有不同的方法可以自动运行命令:
-
upstart系统将执行所有脚本,从中找到目录
/etc/init
的配置。 这些脚本将在系统启动期间运行(或响应某些事件,例如关闭请求),因此运行不与用户交互的命令的地方也是如此; 使用此机制启动所有服务器。您可以在以下url找到可读的介绍: http : //upstart.ubuntu.com/getting-started.html手册页
man 5 init
和man 8 init
为您提供完整的详细信息。 -
每次登录GNOME会话时,都会自动获取主目录中名为
.gnomerc
的shell脚本。 你可以在那里放任意命令; 您在会话中运行的任何程序都将看到您在此脚本中设置的环境变量。请注意,在
.gnomerc
脚本完成之前,会话才会启动; 因此,如果要自动启动一些长时间运行的程序,则需要将&
附加到程序调用,以便将其从正在运行的shell中分离。 -
菜单选项System – > Preferences – > Startup Applications允许您定义在图形会话启动时应启动哪些应用程序(Ubuntu预定义了一些),并根据您的喜好添加或删除它们。 这几乎与
.gnomerc
脚本的目的和范围相同,除了你不需要知道sh
语法(但你也不能使用任何sh
编程结构)。
对于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 for Upstart用户 )。
您可以使用多个ExecStart
行从同一服务文件运行多个命令:
[Service] ExecStart=/some/command ExecStart=/another/command some args ExecStart=-/a/third/command ignore failure
必须始终以完整路径指定命令。 如果任何命令失败,则其余命令不会运行。 A -
在路径告诉systemd忽略非零退出状态(而不是将其视为失败)之前。
相关:
- 在systemd上的Arch Wiki条目
-
man 5 systemd.service
对于用户会话,您可以在~/.config/systemd
创建systemd单元。 这应该适用于16.04以后,但不适用于早期版本的Ubuntu with systemd(因为那些仍然使用Upstart进行用户会话)。 用户会话单元可以使用与系统服务相同的命令进行控制,但添加了--user
选项:
systemctl --user daemon-reload systemctl --user status foo.service
1与长寿守护进程相反。
$HOME/.config/autostart
- 此位置包含启动应用程序列表。
-
.desktop
文件可以放在这里,将在启动时执行。
.desktop
文件的示例:
将以下.desktop
文件放在$HOME/.config/autostart
并给出chmod +x
:
[Desktop Entry] Type=Application Exec="" Hidden=false NoDisplay=false X-GNOME-Autostart-enabled=true Name=Startup Script
这里""
将替换为script.sh
路径
(通常建议使用/usr/local/bin
,这可以通过直接命令来执行,例如将myscript
替换为""
)。
script.sh
示例:
#!/bin/bash exit
结果: .desktop
文件将从$HOME/.config/autostart
,它由Exec=
执行脚本
因此,您可以在启动时运行所需的shell脚本!
对于简单的事情,您可以在System-> Preferences-> Sessions中添加一个指向脚本位置的命令。
或者,您可以将其添加到/etc/init.d/rc.local,或者如果它是更低级别的东西,则创建一个新手工作。
请访问https://help.ubuntu.com/community/UbuntuBootupHowto了解更多信息
你应该使用upstart 。 Upstart用于自动启动的Ubuntu进程。 它是一个增强的解决方案,就像旧的System-V init.d脚本一样。 它还允许您为脚本的开头添加先决条件(即,您是否需要运行网络?等)
cron
答案与顶级投票不同
这个答案仍然使用cron
但使用的方法与最高投票答案不同。 这可以从Ubuntu 16.04开始,但可能更早支持。 只是我从16.04开始使用cron
在计算机启动时运行作业。
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`