我正在尝试在启动 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 秒后它将失败(超时)。
希望这能有所帮助并解决您的问题。