AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 814
Accepted
myusuf3
myusuf3
Asked: 2010-08-05 11:54:17 +0800 CST2010-08-05 11:54:17 +0800 CST 2010-08-05 11:54:17 +0800 CST

如何在启动时运行脚本?

  • 772

如何在 Ubuntu 启动时自动运行脚本,这样我就不必在启动后手动运行它们?

autostart startup
  • 10 10 个回答
  • 1412057 Views

10 个回答

  • Voted
  1. ceejayoz
    2010-08-05T11:57:37+08:002010-08-05T11:57:37+08:00

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

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

      @reboot /path/to/script
      

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

    • 745
  2. Best Answer
    LassePoulsen
    2010-08-05T15:26:21+08:002010-08-05T15:26:21+08:00

    取决于您需要运行哪种脚本。对于服务等,您应该使用upstart。但是对于用户脚本,这些应该由 gnome 作为会话脚本启动!查看系统 > 首选项 > 启动应用程序。

    附带说明一下,如果您需要在终端登录时运行一些脚本,您可以将它们添加到主目录中的.bash_login文件中。

    对于 14.04 及以上版本

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

    start on startup
    task
    exec /path/to/command
    

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

    • 246
  3. paolo granada lim
    2010-08-06T08:40:05+08:002010-08-06T08:40:05+08:00

    您可以将命令添加到/etc/rc.local:

    sudo nano /etc/rc.local
    

    这将以 root 身份执行命令。

    要以特定用户身份执行命令,请使用sudo -i -u(-i也运行登录 shell)。例如,要建立一个持久的 SSH 隧道,myhost在johndoes~/.ssh/config文件中定义:

    sudo -i -u johndoe autossh -nNT -L 1234:localhost:1234 myhost
    

    请注意,如果/etc/rc.local不存在(从 16.04 开始在 Ubuntu 上就是这种情况),您需要在顶部添加一个shebang 行#!/bin/bash(例如),并确保该文件是可执行的:

    sudo chmod a+x /etc/rc.local
    
    • 215
  4. muru
    2016-01-10T11:21:33+08:002016-01-10T11:21:33+08:00

    对于 15.04 及更高版本:

    要在启动时使用1运行(短期)命令systemd,您可以使用 systemd 类型的单元OneShot。例如,创建/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 users)。

    您可以使用多行从同一个服务文件运行多个命令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

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

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

    外壳语法

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


    1与长期存在的守护进程相反。

    • 146
  5. Riccardo Murri
    2010-08-06T06:02:50+08:002010-08-06T06:02:50+08:00

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

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

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

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

      .gnomerc请注意,在脚本完成之前会话不会开始;因此,如果您想自动启动一些长时间运行的程序,您需要附加&到程序调用中,以便将其与正在运行的 shell 分离。

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

    • 75
  6. Pandya
    2014-07-20T22:14:48+08:002014-07-20T22:14:48+08:00

    $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=

    • 38
  7. tutuca
    2010-08-05T11:59:42+08:002010-08-05T11:59:42+08:00

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

    或者,您可以将其添加到 /etc/init.d/rc.local 或者如果它是更底层的东西,则可以做一个新贵的工作。

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

    • 19
  8. WinEunuuchs2Unix
    2018-01-03T17:02:31+08:002018-01-03T17:02:31+08:00

    cron实施的答案与最高投票不同

    此答案仍然使用cron但使用的方法与投票最多的答案不同。这从 Ubuntu 16.04 开始有效,但可能支持得更早。只是我cron从 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可以通过电子邮件向您发送作业运行和@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`
    
    • 9
  9. txwikinger
    2010-08-05T11:58:53+08:002010-08-05T11:58:53+08:00

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

    • 4
  10. Martian2020
    2021-11-05T02:40:33+08:002021-11-05T02:40:33+08:00

    如果您希望您的脚本在内核启动后立即在 systemd 之前运行,AFAIK 的方式是添加init=/path/to/script到内核命令行中/boot/grub/grub.cfg或更多未来证明/etc/grub.d/40_custom通过从中复制菜单条目/boot/grub/grub.cfg并进行所需更改(并update-grub在此之后运行)来制作您自己的菜单条目用于grub将您的自定义文件添加到/boot/grub/grub.cfg)。

    linux   /boot/vmlinuz-5.4.0-26-generic ... ro  quiet splash 
    

    改成

    linux   /boot/vmlinuz-5.4.0-26-generic ... ro  quiet splash init=/path/to/script
    

    注意正确地将 eg#!/bin/bash放在第一行和exec /sbin/init(如果/sbin/init存在于您的系统上 - 在我的系统上它指向 systemd),以避免内核恐慌。

    • 0

相关问题

  • 遇到网络问题时,如何让 Empathy 重试连接

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何安装 .run 文件?

    • 7 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    如何获得 CPU 温度?

    • 21 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Marko Smith

    如何使用命令行将用户添加为新的 sudoer?

    • 7 个回答
  • Marko Smith

    更改文件夹权限和所有权

    • 9 个回答
  • Marko Smith

    你如何重新启动Apache?

    • 13 个回答
  • Marko Smith

    如何卸载软件?

    • 11 个回答
  • Marko Smith

    如何删除 PPA?

    • 26 个回答
  • Martin Hope
    NES 如何启用或禁用服务? 2010-12-30 13:03:32 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    Olivier Lalonde 如何在结束 ssh 会话后保持进程运行? 2010-10-22 04:09:13 +0800 CST
  • Martin Hope
    David B 如何使用命令行将用户添加为新的 sudoer? 2010-10-16 04:02:45 +0800 CST
  • Martin Hope
    Hans 如何删除旧内核版本以清理启动菜单? 2010-08-21 19:37:01 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve