Macbookを開いたら処理を実行し明日まで処理を実行しないシェルスクリプト

目的

一度実行したら再実行しないシェルスクリプトを毎分叩く事でMacbookを朝開いた時に処理を実行するといった事が可能になるかと思った。ある程度のお仕事はこれで自動化したい。暇つぶしに作ることにしました。

コード

#!/bin/sh
PREFIX=/tmp/hoge-
FLAG_PATH=$PREFIX`date +"%Y%m%d"`
if [ -e $FLAG_PATH ]; then :; else
rm $PREFIX*
touch $FLAG_PATH
echo "処理" || rm $FLAG_PATH
fi

今のところ思いついた処理は上記。実行時にテンポラリディレクトリに実行したというファイルを設置する。次回実行時はそのファイルが存在すれば実行しないようにする。実行している処理が失敗したら実行したというファイルを削除することで再実行される。(再度実行が連続で発生したら問題になるような処理はrmしなければ連続実行されない。)

次の暇を見つけたら、実行中と終了済みというフラグも管理できるようにしたい。なるべく環境構築はしたくないし、10年くらい持たせたいのでシェルスクリプトでなんとかしたい。

もっと良い処理があれば教えてください。

KotlinでAmazonS3にファイルをアップロードする

依存関係を追加する

compile 'com.amazonaws:aws-java-sdk-s3:1.11.185'

ラッパーを作ってみました

class File(
private val path: String,
private val body: String
) {
companion object {
val S3_ACCESS_KEY = "xxxxx"
val S3_SECRET_KEY = "xxxxx"
val S3_SERVICE_END_POINT = "https://s3-ap-northeast-1.amazonaws.com"
val S3_REGION = "ap-northeast-1"
val S3_BUCKET_NAME = "xxxxx"
}
fun save() {
val file = File(path)
val writer = FileWriter(file)
writer.write(body)
writer.close()
val client = AmazonS3ClientBuilder
.standard().
withCredentials(AWSStaticCredentialsProvider(BasicAWSCredentials(S3_ACCESS_KEY, S3_SECRET_KEY)))
.withClientConfiguration(ClientConfiguration().apply {
protocol = Protocol.HTTPS
connectionTimeout = 10000
})
.withEndpointConfiguration(EndpointConfiguration(S3_SERVICE_END_POINT, S3_REGION))
.build()
try {
client.putObject(PutObjectRequest(S3_BUCKET_NAME, file.name, file).apply {
cannedAcl = CannedAccessControlList.PublicRead
})
} catch (e: AmazonClientException) {
e.printStackTrace()
}
}
}

使う時はこのように使います

File("/tmp/backup/test", "テストファイルです").save()