it-swarm.cn

如何在启动时运行脚本?

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

497
myusuf3

根据您需要运行的脚本类型..对于服务等,您应该使用 pstart 。但是对于用户脚本,这些应该由gnome作为会话脚本启动!在System> Preferences> Startup Applications下查看。

另外,如果您需要在终端登录时运行某些脚本,可以将它们添加到主目录中的 。bash_login 文件中。

14.04及以上

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

start on startup
task
exec /path/to/command

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

200
LassePoulsen

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

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

    @reboot /path/to/script
    

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

531
ceejayoz

如何将命令添加到/etc/rc.local?你必须使用Sudo访问来编辑这个文件。

Sudo nano /etc/rc.local
154
paolo granada lim

有不同的方法可以自动运行命令:

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

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

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

    请注意,在.gnomerc脚本完成之前,会话才会启动;因此,如果要自动启动某个长时间运行的程序,则需要将&附加到程序调用中,以便将其与正在运行的Shell分离。

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

70
Riccardo Murri

对于15.04及更高版本:

跑(短命)1 使用 systemd 启动命令时,可以使用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(参见 pdart用户的Systemd )。

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

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

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

相关:


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

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

Shell语法

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


1而不是长寿的守护进程。

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

因此,你可以在启动时运行你想要的Shell脚本!

27
Pandya

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

或者你可以把它添加到/etc/init.d/rc.local或者做一个 pstart 作业,如果它是一个更多低级别 东西。

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

18
tutuca

你应该使用 pstart 。 Upstart用于自动启动的Ubuntu进程。它是一个增强的解决方案,就像旧的System-V init.d脚本一样。它还允许您将先决条件放入脚本的开头(即您是否需要运行网络?等)

5
txwikinger

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`
3
WinEunuuchs2Unix