systemctl start service 命令在 ec2 的用户数据中不起作用

systemctl start service 命令在 ec2 的用户数据中不起作用

我正在尝试在启动 ec2 实例时在 ec2 实例中运行 systemctl 服务。因此,为了在启动 ec2 实例时运行我的脚本,我使用 ec2 实例的用户数据运行我的脚本。因此,我的脚本在 bash 中有以下几行代码

启动脚本

#!/usr/bin/env sh
set -e

FILE=/etc/rsyslog.d/"$SERVICE_NAME".conf
  sudo touch "$FILE"

  cat <<EOM | sudo tee "$FILE"
if \$programname == "$SERVICE_NAME" then "$ROUTER_LOGS"
& stop
EOM

ROUTER_LOGS=/var/log/router/out.log
  FILE=/usr/local/bin/upload_logs.sh
  sudo touch $FILE
  chmod +x $FILE
  S3_BUCKET=my-bucket
  cat <<EOM | sudo tee $FILE
aws s3 cp $ROUTER_LOGS s3://$S3_BUCKET/logs/$HOSTNAME/$SERVICE_NAME.log.$(date +%Y-%m-%d_%H%M%S)
EOM

FILE=/etc/logrotate.d/router
  sudo touch $FILE
  cat <<EOM | sudo tee $FILE
/var/log/router/*.log {
    hourly
    rotate 24
    missingok
    notifempty
    compress
    delaycompress
    endscript
}

FILE="/etc/systemd/system/router.service"
  cat <<EOM | sudo tee $FILE
[Unit]
  Description=$SERVICE_NAME
  After=network.target
  Requires=network.target

[Service]
  WorkingDirectory=$APP_DIR/target/release/
  ExecStart=$APP_DIR/target/release/router
  ExecStopPost=/bin/bash /usr/local/bin/upload_logs.sh
  StandardOutput=syslog
  StandardError=syslog
  SyslogIdentifier=$SERVICE_NAME
  TimeoutStartSec=1000s
  Environment="RUST_LOG=info"
  Environment="RUST_ENV=$ENV"
  Environment="APP_DIR=$APP_DIR"
  Restart=on-failure
  Type=simple

[Install]
  WantedBy=multi-user.target

EOM


  sudo systemctl daemon-reload
  sudo systemctl enable router.service
  sudo systemctl status router.service #
  sudo systemctl start router.service
  sudo systemctl status router.service

上述脚本的输出是

● router.service - gql-router
   Loaded: loaded (/etc/systemd/system/router.service; enabled; vendor preset: disabled)
   Active: inactive (dead)

我在 AWS 的 EC2 中使用 Centos 7 Linux。

但是当我尝试使用 ssh 在机器内运行它时,它可以正常工作。因此问题在于使用 EC2 的用户数据运行。我尝试使用 journalctl 检查日志,但没有找到该服务的条目。有人可以帮我解决这个问题吗?

答案1

由于 ,脚本将会因 而出现任何错误而退出set -e

为了更好地排除故障,您需要set -x进行调试并查看发生了什么。

可能原因:

After=network.target Requires=network.target

看起来该脚本需要网络服务启动,如果没有启动,它就会退出。

解决方法是等待网络服务启动。

为此,您需要将以下两行替换为:

After=network-online.target Wants=network-online.target

这将使其等待网络服务上线。90 秒后它将失败(超时)。

希望这能有所帮助并解决您的问题。

相关内容