如何在启动时使用systemd运行单个命令?


112

我想在启动后使用以下命令启动Apache Spark集群:

sudo ./path/to/spark/sbin/start-all.sh

系统准备重新引导/关闭时,请运行以下命令:

sudo ./path/to/spark/sbin/stop-all.sh

我该如何开始?有没有可以建立的基本模板?

我尝试使用一个非常简单的(文件:)/lib/systemd/system/spark.service

[Unit]
Description=Spark service

[Service]
ExecStart=sudo ./path/to/spark/sbin/start-all.sh

这不起作用。



@WillemK,您好,我已经查看了此页面。这个问题我觉得是我不能随便更换execExecStart=。另外,我以前从未用过新贵。
Macourtney7 '17

1
脚本路径前的点看起来非常可疑。
Andrea Lazzarotto

@AndreaLazzarotto我认为OP正在尝试以OP在终端中的方式运行脚本,因此....
George Udosen

@AndreaLazzarotto,您好,这是正确的。造成任何混乱,我们深表歉意。
Macourtney7

Answers:


141

您的.service文件应如下所示:

[Unit]
Description=Spark service

[Service]
ExecStart=/path/to/spark/sbin/start-all.sh

[Install]
WantedBy=multi-user.target

现在,再执行几个步骤来启用和使用该.service文件:

  1. 将其放在/lib/systemd/system名称为的文件夹中myfirst.service

  2. 使用以下命令使脚本可执行:

    chmod u+x /path/to/spark/sbin/start-all.sh
    
  3. 启动它:

    sudo systemctl start myfirst
    
  4. 使它在引导时运行:

    sudo systemctl enable myfirst
    
  5. 停下来:

    sudo systemctl stop myfirst
    

笔记:

  1. 您无需在服务中使用sudo启动Spark,因为默认服务用户已经是root。

  2. 请查看下面的链接以获取更多systemd选项。

更新

现在,我们上面的内容只是基本的,这里是spark的完整设置:

[Unit]
Description=Apache Spark Master and Slave Servers
After=network.target
After=systemd-user-sessions.service
After=network-online.target

[Service]
User=spark
Type=forking
ExecStart=/opt/spark-1.6.1-bin-hadoop2.6/sbin/start-all.sh
ExecStop=/opt/spark-1.6.1-bin-hadoop2.6/sbin/stop-all.sh
TimeoutSec=30
Restart=on-failure
RestartSec=30
StartLimitInterval=350
StartLimitBurst=10

[Install]
WantedBy=multi-user.target

设置服务:

sudo systemctl start spark.service
sudo systemctl stop spark.service
sudo systemctl enable spark.service

进一步阅读

请通读以下链接。Spark是一个复杂的设置,因此您应该了解它如何与Ubuntu的init服务集成。

https://datasciencenovice.wordpress.com/2016/11/30/spark-stand-alone-cluster-as-a-systemd-service-ubuntu-16-04centos-7/

https://www.digitalocean.com/community/tutorials/understanding-systemd-units-and-unit-files

https://www.freedesktop.org/software/systemd/man/systemd.unit.html


记录和更新
George Udosen '17

1
谢谢您,我根据您的建议创建了一个文件。在运行时sudo systemctl start spark会收到以下错误:Failed to start spark.service: Unit spark.service is not loaded properly: Invalid argument. See system logs and 'systemctl status spark.service' for details.
macourtney7

其主要部分systemctl status spark.service如下:Executable path is not absolutespark.service: Service lacks both ExecStart= and ExecStop= setting. Refusing.
macourtney7 '17

问题是:1)需要Spark二进制路径(应替换服务文件中的二进制路径); 2)Spark具有关闭命令是什么。3)您是否浏览了我给您的链接。我不使用火花,请提供火花
乔治·乌德森

你的答案@GeorgeUdosen谢谢,我的问题是重新启动后,具体的指挥下,我怎么能运行火花的问题是在这里吗?askubuntu.com/questions/979498/...
Soheil Pourbafrani

2

这将/root/boot.sh使用最小的服务文件创建并在引导时(以root用户身份)运行:

bootscript=/root/boot.sh
servicename=customboot

cat > $bootscript <<EOF
#!/usr/bin/env bash
echo "$bootscript ran at $(date)!" > /tmp/it-works
EOF

chmod +x $bootscript

cat > /etc/systemd/system/$servicename.service <<EOF
[Service]
ExecStart=$bootscript
[Install]
WantedBy=default.target
EOF

systemctl enable $servicename

您可以将其Ctrl+ C放入根终端。

要修改参数,例如使用其他参数,请$bootscript手动设置该变量,并在复制命令时跳过该行。

运行命令后,您可以使用自己喜欢的编辑器编辑启动脚本,它将在下次启动时运行。您也可以使用以下命令立即运行它:

systemctl start $servicename

每一步都可以使用sudo完成,但是稍微复杂一些,并且某些系统未安装sudo,因此有些人在使用之前必须修改示例。因此,我选择在示例中不包括sudo。


我对systemd文档有些困惑,但是不应该这样,Type=oneshot RemainAfterExit=yes否则除非自定义脚本使某些进程运行,否则systemd会认为任务处于非活动状态。
彼得·兰伯格

@PeterLamberg我也尝试阅读systemd文档,但我们俩都是;)。我记得它们不是很清楚,但是我发布的答案在多个系统上对我都有效(我不时重新访问此页面)。您是说,因为它被认为是“非活动”的,所以每个后续的“开始”调用都会重新运行该脚本?因为我会认为这是shell脚本所期望的。如果在重新启动之前不得不“停止”实际上未运行的内容,我会觉得很奇怪。
吕克(Luc)
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.