我们可以通过AWS SSM将命令作为后台进程运行吗?

问题描述

我正在尝试同步一个S3存储桶,这需要3个小时才能完全同步。

sync-bucket.sh:

nohup aws s3 sync "$source_bucket/$folder/" "s3://$destination_bucket/" \
        --profile abc --acl bucket-owner-full-control --sse "aws:kms" \
        --sse-kms-key-id "$KEY_ARN" > /var/log/$folder.log 2>&1 &

echo "Successfully triggered the sync job"

我希望使用如下所示的AWS SSM send命令触发同步作业:

trigger.sh:

COMMAND=$(aws ssm send-command --document-name "AWS-RunShellScript" \
            --targets "Key=instanceids,Values=${RECOVERY}"  \
            --parameters '{"executionTimeout":["10800"],"commands":["/opt/scripts/sync-bucket.sh"]}' \
            --output-s3-bucket-name "some-bucket" \
            --timeout-seconds 10800 \
            | jq -r '.Command.CommandId')

我的观察是,SSM等待该后台作业完成,然后再将执行标记为“成功”。有没有办法可以触发后台作业并使SSM完成执行而不必等待后台作业完成?

或者有更好的方法吗?我基本上是在尝试使过程自动化,并乐于让该作业按需在后台运行,而不必手动登录实例并运行命令。

感谢您的时间。

解决方法

问题不在于 SSM 正在等待您的后台命令完成,而是您的命令实际上并未置于后台,因为您的 nohup 命令等待输入。要修复,请将 nohup whatever_your_command_is & 替换为 nohup whatever_your_command_is < /dev/null 2> /dev/null > /dev/null &

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...