如何在启动时运行脚本?

Rus*_*sty 131 startup command-line scripts

我在一个文件夹中有一个脚本:

/path/to/my/script.sh
Run Code Online (Sandbox Code Playgroud)

每次系统启动时我都需要运行这个脚本(即使没有人登录系统)。我需要做什么才能实现这一目标?

jdt*_*ood 154

您将需要 root 权限才能执行以下任何操作。要获得 root,请打开终端并运行命令

sudo -i
Run Code Online (Sandbox Code Playgroud)

并且命令提示符将更改为“#”,表示终端会话具有 root 权限。

备选方案#1:向 /etc/rc.local

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

内容如下:

# This script is executed at the end of each multiuser runlevel
/path/to/my/script.sh || exit 1   # Added by me
exit 0
Run Code Online (Sandbox Code Playgroud)

替代方案 #2:添加一个 Upstart 作业(对于 15.04 之前的系统)(不推荐)

创建 /etc/init/myjob.conf

vi /etc/init/myjob.conf
Run Code Online (Sandbox Code Playgroud)

内容如下

description     "my job"
start on startup
task
exec /path/to/my/script.sh
Run Code Online (Sandbox Code Playgroud)

来自暴发户网站的官方声明->“项目仅处于维护模式。没有正在开发新功能,一般建议是转移到另一个最小的 init 系统或 systemd。”

替代方案 #3:添加一个 init 脚本(已过时)

中创建一个新脚本/etc/init.d/myscript

vi /etc/init.d/myscript
Run Code Online (Sandbox Code Playgroud)

(显然它不必被称为“myscript”。)在这个脚本中,做任何你想做的事。也许只需运行您提到的脚本。

#!/bin/sh
/path/to/my/script.sh
Run Code Online (Sandbox Code Playgroud)

使其可执行。

chmod ugo+x /etc/init.d/myscript
Run Code Online (Sandbox Code Playgroud)

将 init 系统配置为在启动时运行此脚本。

update-rc.d myscript defaults
Run Code Online (Sandbox Code Playgroud)

  • 人们现在不应该使用 upstart 吗? (2认同)
  • 刚刚添加了 Upstart-job 方法作为第三种选择。 (2认同)
  • 如果#3 已经过时了,我们现在应该怎么做? (2认同)

Dan*_*nes 65

您不需要root,甚至不需要登录。

您可以编辑您的 crontab ( crontab -e) 并创建如下条目:

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

这样,您就可以以普通用户身份运行它。@reboot只是意味着它在计算机启动时运行(不一定只在重新启动时运行)。

PS:关于这不能正常工作的评论

有人说这不适用于基于 Debian 的发行版,例如 Ubuntu。我个人已经在 Ubuntu 和 Mint 上成功地使用了这种方法。但是,有几件事需要考虑。

@rebootcron守护程序启动时,作业的运行。我发现在基于 Debian 的发行版上,这可能发生在/home分区被挂载之前。如果您正在运行的脚本在您的主文件夹中,它将失败。

此外,这不仅限于基于 Debian 的发行版,而且如果您的主文件夹已加密,则在您登录之前可能无法解密。可能没有办法解决这个问题。

此外,您的网络接口可能尚未启动,如果该命令需要访问 Internet,则可能会失败。

最后,再次重申,这不仅限于基于 Debian 的发行版,而且 cron 运行的环境比您的 shell 运行的环境要有限得多。特别是,PATH变量的路径要少得多。这可能是正在运行的命令没有找到,如果它在,例如,像$HOME/.local/bin,这可能是你PATH在你的shell会话,但不能下cron。甚至有可能正在运行的命令取决于某些未在cron.

因此,您的命令将在 cron 下运行的原因有很多,但这并不是因为@reboot它不适用于您的发行版。

  • @Qwertylicious,不,用户不需要登录即可运行 cron 作业。无论他是否登录,此方法都有效,因为 cron 运行一个系统进程,并且在运行用户的 cron 作业时,它以该用户的身份运行该作业。只要电脑开机,cron就会运行,不管谁登录。 (4认同)
  • 这在 Debian 和变体中不起作用;Ubuntu,薄荷。 (3认同)

Cha*_*tor 14

从终端

  1. newshell.sh.desktop~/.config/autostart文件夹中创建文件:

    gedit ~/.config/autostart/newshell.sh.desktop
    
    Run Code Online (Sandbox Code Playgroud)
  2. 变化ExecNameComment值,并添加到文件:第一行

     [Desktop Entry]
     Type=Application
     Exec=/full/link/to/your/newshell.sh
     Name=newshell
     Comment=whatever you want
    
    Run Code Online (Sandbox Code Playgroud)
  3. 节省

或者

您可以从 GUI 执行此操作:

  1. 在 Ubuntu 14.04 中运行“启动应用程序”工具,您只需将其写在搜索框中即可。
  2. 添加相同的Exec,NameComment

  • 请注意,OP 明确希望它在任何人登录之前在系统启动时启动。自动启动脚本仅在登录时运行。 (6认同)