如何以root身份启动期间运行脚本


59

我有一个脚本,可以在不使用networkmanager的情况下自动启用wifi,但是我不知道如何在系统引导时以root用户身份运行脚本。如何使脚本在引导过程中自动运行?


自动启动程序的配置autostart清单或*.service文件,在几个地点,以及在init.dcrontab。看到这个:unix.stackexchange.com/a/525845/43233
Noam Manos

Answers:


54

将要运行的脚本放在/etc/init.d目录中,并使该脚本可执行。

chmod 755 myscript

完成此操作后,在您要使用的运行级别目录中创​​建一个符号链接,例如,如果要在图形运行级别2(Ubuntu的默认运行级别)中运行程序,则可以将其放置在/etc/rc2.d目录中。您只是无法将其放置在目录中,必须用“ S”表示启动,以指明其运行时间,并且执行顺序很重要。通过给它更大的编号,将其放在目录中的所有其他内容之后。

如果最后一个要运行的脚本是rc.local它的名字,S99rc.local那么您需要将脚本添加为S99myscript

ln -s /etc/init.d/myscript /etc/rc3.d/S99myscript

每个向后兼容/etc/rc*.d目录都有指向该/etc/init.d/目录的符号链接。


1
请注意,在Ubuntu Server 14.04下,我需要使用/etc/rc2.d,而不是rc3.d如示例中所示。似乎rc2.d不仅是图形运行级别。
布拉德2014年

1
cd /etc/rc`cat /etc/init/rc-sysinit.conf | grep "env DEFAULT_RUNLEVEL" | grep -oP "\d"`.d将带您到/etc/rc?.d与默认运行级别相对应的目录。
凯文(Kevin)

1
而是:“如果要运行的最后一个脚本是rc.local它的名字,S99rc.local那么您需要将脚本添加为S99myscript。”。您的意思是:“如果要运行的最后一个脚本是myscript它的名字,S99myscript那么您需要将脚本添加为S99myscript。”
2016年

6
请记住,这不适用于systemd(即,从Ubuntu 16.04开始)。看到这个代替。
亚历山大·雷沃

26

在中包含命令/etc/rc.local。每当用户的运行级别更改时,它将运行。

注意:您必须将命令放在/etc/rc.local的最后一行之前,该行包含:“ exit 0”。


3
注意:您必须将命令放在/etc/rc.local包含以下内容的最后一行之前: exit 0
rubo77

3
/etc/rc.local在ubuntu 15.10中有注释:“此脚本在每个多用户运行级别的末尾执行。” 因此该脚本可以在引导期间运行几次,对吗?
jarno 2015年

@jamo,是的,在每个运行级别上。我不知道这与“启动时运行”有何关系,通常这意味着“启动时运行一次”。
erm3nda

17

使用crontab选项使脚本在重新启动后运行,

您可以通过@rebootcron中添加代码来做到这一点

由root用户打开crontab:

$ sudo crontab -e

在底部添加下一条记录:

@reboot yourScriptPath 

那会做你想要的。


您的意思是使用crontab -e不需要超级用户特权的command 吗?我想知道它是否可以运行需要以root身份运行的脚本。
jarno 2015年

我测试了这个。它不会以超级用户身份运行脚本。
jarno'1

4
您必须在运行命令时添加该行,sudo crontab -e以使其在启动期间以root用户身份运行脚本。
jarno '16

别忘了删除/var/run/crond.reboot,否则将无法执行任务
AlbertCatalà16年

仅作记录,我敢肯定@jarno已经知道了。每个用户都有自己的cron任务,因此,如果将其添加到用户的任务中(运行crontab -e而不使用sudo),则脚本将由用户运行。因此,您需要以root用户身份运行它,以使其能够在引导时以root用户身份运行脚本。
eddieferetro

9

这在Ubuntu 17.04上对我有用:

  1. 创建游览脚本文件,如disable_cdrom在方便您的位置。就我而言home/yterle/disable_cdrom。就我而言:

    #!/bin/sh
    eject /dev/sr0 -i 1
    
  2. 使它可执行 chmod 775 disable_cdrom

  3. 导航到/etc/systemd/system并在其中创建一个service文件。例如sudo gedit /etc/systemd/system/disable_cdrom.service

我的disable_cdrom.service样子是这样的:

[Unit]
Description=Disable cdrom

[Service]
Type=oneshot
ExecStart=/bin/sh /home/yterle/disable_cdrom

[Install]
WantedBy=multi-user.target

ExecStart指向与运行脚本/bin/sh

然后运行systemctl enable disable_cdrom.service以启用systemd服务


1
投票表决是我一直在寻找的,但是我想您的意思是systemctl enable disable_cdrom.service
KennetRunner

5

/etc/init.d/ 以可执行权限将脚本文件包含到其中,然后设置不同的运行级别

$ update-rc.d script-name default

它将使您的脚本启动启动。


在Kali Linux v2.0上对我不起作用。你是说update-rc.d script-name enable
Sopalajo de Arrierez,2015年

update-rc.d <脚本名称>默认Shell脚本,您已在/etc/init.d/ <脚本名称>中复制了该副本
MS Parmar 2015年

4

在中创建一个像这样的文本文件/etc/cron.d/

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

@reboot   root    yourScriptPath

(您应该替换yourScriptPath为要运行的脚本的路径。)


1

小心地将脚本添加到rc.local-由于该脚本,我陷入了启动画面。按下Alt+会F1显示初始屏幕后面发生了什么(脚本rc.local正在运行)。

我不能摆脱它。

  • Ctrl+ Alt+ Del
  • Alt+ PrtSc+ K
  • Ctrl+ Alt+F#

什么都行不通。

我必须从USB Ubuntu映像启动,找到rc.local,然后授予自己文件权限并删除它。我想如果您不知道自己在做什么,就不应该做任何事情。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.