[Unit]
Description=Job that runs your user script
[Service]
ExecStart=/some/command
Type=oneshot
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
$ 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
一种方法是添加一个@reboot cron任务:
crontab -e
将允许您编辑您的 cron。像这样添加一行:
计算机启动后将执行该脚本。
取决于您需要运行哪种脚本。对于服务等,您应该使用upstart。但是对于用户脚本,这些应该由 gnome 作为会话脚本启动!查看系统 > 首选项 > 启动应用程序。
附带说明一下,如果您需要在终端登录时运行一些脚本,您可以将它们添加到主目录中的.bash_login文件中。
对于 14.04 及以上版本
一个简单的命令(不需要继续运行)可以使用 Upstart 作业,例如:
将其保存在一个
.conf
文件中/etc/init
(如果您需要在系统启动时以 root 身份运行),或保存在~/.config/upstart
(如果您需要在登录时以用户身份运行)。您可以将命令添加到
/etc/rc.local
:这将以 root 身份执行命令。
要以特定用户身份执行命令,请使用
sudo -i -u
(-i
也运行登录 shell)。例如,要建立一个持久的 SSH 隧道,myhost
在johndoe
s~/.ssh/config
文件中定义:请注意,如果
/etc/rc.local
不存在(从 16.04 开始在 Ubuntu 上就是这种情况),您需要在顶部添加一个shebang 行#!/bin/bash
(例如),并确保该文件是可执行的:对于 15.04 及更高版本:
要在启动时使用1运行(短期)命令
systemd
,您可以使用 systemd 类型的单元OneShot
。例如,创建/etc/systemd/system/foo.service
包含:然后运行:
本质上,这只是将典型的 Upstart 作业转换为 systemd 作业(请参阅Systemd for Upstart users)。
您可以使用多行从同一个服务文件运行多个命令
ExecStart
:该命令必须始终以完整路径给出。如果任何命令失败,其余的都不会运行。路径之前的A
-
告诉 systemd 忽略非零退出状态(而不是将其视为失败)。相关的:
man 5 systemd.service
对于用户会话,您可以在其中创建 systemd 单元
~/.config/systemd/user
。这应该适用于 16.04 以后的版本,但不适用于带有 systemd 的早期版本的 Ubuntu(因为那些仍然使用 Upstart 进行用户会话)。用户会话单元可以使用与系统服务相同的命令进行控制,但--user
添加了以下选项:外壳语法
请注意,与 Upstart 不同,systemd 不会
Exec*
通过 shell 运行命令。它本身执行一些有限的变量扩展和多个命令(由 分隔;
),但就类似于 shell 的语法而言,仅此而已。对于更复杂的事情,比如重定向或管道,将您的命令包装在sh -c '...'
or中bash -c '...'
。1与长期存在的守护进程相反。
自动运行命令有多种方式:
新贵系统将执行它在目录中找到配置的所有脚本
/etc/init
。这些脚本将在系统启动期间运行(或响应某些事件,例如关闭请求),因此是运行不与用户交互的命令的地方;所有服务器都使用这种机制启动。您可以在以下位置找到可读的介绍:http ://upstart.ubuntu.com/getting-started.html手册页
man 5 init
并man 8 init
为您提供完整的详细信息。.gnomerc
每次登录到 GNOME 会话时,都会自动获取在您的主目录中命名的 shell 脚本。您可以在其中放置任意命令;您在此脚本中设置的环境变量将被您在会话中运行的任何程序看到。.gnomerc
请注意,在脚本完成之前会话不会开始;因此,如果您想自动启动一些长时间运行的程序,您需要附加&
到程序调用中,以便将其与正在运行的 shell 分离。菜单选项System -> Preferences -> Startup Applications允许您定义在图形会话启动时应该启动哪些应用程序(Ubuntu 预定义了很多),并根据您的喜好添加或删除它们。这与脚本的目的和范围几乎相同
.gnomerc
,只是您不需要了解sh
语法(但您也不能使用任何sh
编程结构)。$HOME/.config/autostart
包含启动应用程序列表。.desktop
此文件夹中的文件将在启动时执行。它可能需要可执行权限 (chmod +x startup.desktop
)。文件示例
.desktop
:此处
"</path/to/script>"
替换为您的路径script.sh
如果您将脚本myscript
放入/usr/local/bin
以便可以通过命令直接执行,则可以编写myscript
而不是"</path/to/script>"
.示例
myscript.sh
:结果:
.desktop
文件将从$HOME/.config/autostart
哪个执行脚本启动Exec=
对于简单的事情,您可以在System->Preferences->Sessions中添加一个指向脚本位置的命令。
或者,您可以将其添加到 /etc/init.d/rc.local 或者如果它是更底层的东西,则可以做一个新贵的工作。
查看https://help.ubuntu.com/community/UbuntuBootupHowto了解更多信息
cron
实施的答案与最高投票不同此答案仍然使用
cron
但使用的方法与投票最多的答案不同。这从 Ubuntu 16.04 开始有效,但可能支持得更早。只是我cron
从 16.04 开始在计算机启动时开始使用它来运行作业。什么时候
cron
运行?在评论中有人问“他们什么时候跑?”。你可以在 syslog/journalctl 中知道:
需要注意的一件事是
cron
可以通过电子邮件向您发送作业运行和@reboot
作业运行的状态,以便早期网络管理器和电子邮件不会运行,除非您将sleep
命令放入脚本中。把你的脚本放在哪里
将您的脚本放在目录中
/etc/cron.d
:脚本是什么样的?
这是我设置的几个脚本来运行每次启动:
您应该为此使用新贵。Upstart 用于自动启动的 Ubuntu 进程。它是一个增强的解决方案,就像旧的 System-V init.d 脚本一样。它还允许您在脚本开始时添加先决条件(即您需要网络运行吗?等等)
如果您希望您的脚本在内核启动后立即在 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
)。改成
注意正确地将 eg
#!/bin/bash
放在第一行和exec /sbin/init
(如果/sbin/init
存在于您的系统上 - 在我的系统上它指向 systemd),以避免内核恐慌。