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

如何使用 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

这是行不通的。

答案1

你的.service文件看起来应该像这样:

[Unit]
Description=Spark service

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

[Install]
WantedBy=multi-user.target

现在,请执行更多步骤来启用和使用该.service文件:

  1. 将其放在/etc/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 服务集成。

答案2

将其复制粘贴到终端(以 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

答案3

在 systemd 中添加启动项比较复杂,比较麻烦,为了方便,我写了一个工具添加服务提供了一种在 systemd 中快速添加启动项的简单方法。

安装:

pip3 install add_service

用法:

python -m add_service [shell_file/cmd] [user (default `whoami`)]

例子:

python -m add_service ssh_nat.sh  # by default user is `whoami`
python -m add_service "`which python3` -m http.server 80" root

相关内容