如何在Ubuntu Server 17.10上启动时运行脚本?


13

如何在Ubuntu Server 17.10计算机上启动时运行脚本?我认为方法已在17.10中更改。

Answers:


14

使用时间表将脚本放入适当的用户cron表(即crontab)中@reboot

用户可以使用来编辑其croncrontab -e

一个将/path/to/script.sh在启动时运行的示例:

@reboot /path/to/script.sh

如果您需要以root用户身份运行,请不要使用@reboot sudo /path/to/script.sh;
用于sudo crontab -eu root编辑root的crontab。

另请参阅: crontab(1),cron(8),crontab(8)


2

默认情况下,Ubuntu 15.04及更高版本使用一种称为的东西systemd,它是一种程序(可以自动执行启动服务和过程)。您可以自己制作并将其添加到启动服务列表中,而无需付出任何努力。

基本系统服务

这是一个准系统.service文件,可用于启动我的python gui服务器(本来可以是Shell脚本,没关系):

[Unit]
Description=Python GUI Server

[Service]
ExecStart=/home/pi/software/GUI_POE.py &

[Install]
WantedBy=multi-user.target

Description选项是描述服务内容或功能的任何字符串。

ExecStart选项指定要执行的命令。在这里,我给出了一个可执行的python脚本的路径,并使用&令牌在后台运行它。

WantedBy选项根据目标想要使用此服务来指定优先级。如果您不需要在任何特定时间运行服务,只需将其设置为即可multi-user.target

基本程序

  1. 使用nano或选择任何编辑器编写您希望在启动时运行的脚本。确保在文件的最顶部包含适当的shebang(#!/bin/bash用于bash脚本),并使用授予其可执行权限chmod

  2. 只需将服务写入名为my_service.service的文件,然后使用将其复制到正确的目录中cp my_service.service /lib/systemd/system/

  3. 开始服务:sudo systemctl start my_service.service。这将启动您告诉您的服务运行的任何脚本。使用“停止”而不是启动的相同命令将其关闭。

  4. 将您的服务添加到启动过程中:sudo systemctl enable my_service.service。要删除它,只需在同一命令中将“启用”替换为“禁用”即可。

就是这样!请记住,您的脚本将自动以root权限运行,这是systemd服务中的默认设置。

我的简单例子(完整)

作为参考,这是我使用的一个简单的systemd服务,该服务使用Dash启动一个简单的Python GUI Server:

[Unit]
Description=Python GUI Server
After=network-online.target

[Service]
Type=simple
WorkingDirectory=/home/pi/software
ExecStart=/home/pi/software/GUI_POE.py &
Restart=always
RestartSec=15s
KillMode=process
TimeoutSec=infinity
User=pi
Group=pi

[Install]
WantedBy=multi-user.target

此示例服务使用Python3脚本,但是公式与Shell脚本完全相同。

可以在DigitalOcean的这本出色的教程中找到进一步的阅读信息,并且该AskUbuntu线程提供了一个出色的答案,可以帮助我学习systemd。希望这可以帮助!


2
感谢您为这个问题带来系统的观点!我要指出的是,实际上并不需要在ExecStart行中强制设置背景。
杰夫·谢勒
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.