当前位置: 首页>>技术教程>>正文


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

,

问题描述

我想在启动后使用以下命令启动 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

哪个不起作用。

最佳方案

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

[Unit]
Description=Spark service

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

[Install]
WantedBy=multi-user.target

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

  1. 将其放在名称类似于 myfirst.service/etc/systemd/system 文件夹中。\n

  2. 确保您的脚本可执行:

    \n

     chmod u+x /path/to/spark/sbin/start-all.sh\n

    \n

  3. 启动它:

    \n

     sudo systemctl start myfirst\n

    \n

  4. 让它在开机时运行:

    \n

     sudo systemctl enable myfirst\n

    \n

  5. 停下来:

    \n

     sudo systemctl stop myfirst\n

    \n

说明

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

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

Moreover

现在我们上面的只是基本的,这里是 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 服务集成。

次佳方案

Copy-paste 进入终端(作为 root)以创建 /root/boot.sh 并在启动时运行它:

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

要修改参数,例如使用不同的 $bootscript ,只需手动设置该变量并在复制命令时跳过该行。

运行命令后,您可以使用您喜欢的编辑器编辑 /root/boot.sh,它将在下次启动时运行。您也可以使用以下命令立即运行它:

systemctl start $servicename

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/13597.html,未经允许,请勿转载。