mirror of
https://github.com/tiredofit/docker-db-backup.git
synced 2025-12-22 05:33:53 +01:00
Compare commits
13 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
366c4759a5 | ||
|
|
37f255ec99 | ||
|
|
efa9a678c0 | ||
|
|
68747a4aff | ||
|
|
cf736278bb | ||
|
|
1659e34fc7 | ||
|
|
a8df7a2c75 | ||
|
|
b5194dcce9 | ||
|
|
6fb947684a | ||
|
|
9287f4efeb | ||
|
|
eeb5b5a119 | ||
|
|
a83dfd1a0b | ||
|
|
8fb379b51a |
116
.github/workflows/main.yml
vendored
116
.github/workflows/main.yml
vendored
@@ -1,111 +1,15 @@
|
|||||||
### Application Level Image CI
|
name: "build_image"
|
||||||
### Dave Conroy <dave at tiredofit dot ca>
|
|
||||||
|
|
||||||
name: 'build'
|
|
||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
paths:
|
paths:
|
||||||
- '**'
|
- "**"
|
||||||
- '!README.md'
|
- "!README.md"
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
docker:
|
build:
|
||||||
runs-on: ubuntu-latest
|
uses: tiredofit/github_actions/.github/workflows/default_amd64_armv7_arm64.yml@main
|
||||||
steps:
|
#uses: tiredofit/github_actions/.github/workflows/default_amd64.yml@main
|
||||||
- name: Checkout
|
#uses: tiredofit/github_actions/.github/workflows/default_amd64_armv7_arm64.yml@main
|
||||||
uses: actions/checkout@v3
|
#uses: tiredofit/github_actions/.github/workflows/default_amd64_arm64.yml@main
|
||||||
|
secrets: inherit
|
||||||
- name: Prepare
|
|
||||||
id: prep
|
|
||||||
run: |
|
|
||||||
DOCKER_IMAGE=${GITHUB_REPOSITORY/docker-/}
|
|
||||||
if [[ $GITHUB_REF == refs/heads/* ]]; then
|
|
||||||
if [[ $GITHUB_REF == refs/heads/*/* ]] ; then
|
|
||||||
BRANCH="${DOCKER_IMAGE}:$(echo $GITHUB_REF | sed "s|refs/heads/||g" | sed "s|/|-|g")"
|
|
||||||
else
|
|
||||||
BRANCH=${GITHUB_REF#refs/heads/}
|
|
||||||
fi
|
|
||||||
|
|
||||||
case ${BRANCH} in
|
|
||||||
"main" | "master" )
|
|
||||||
BRANCHTAG="${DOCKER_IMAGE}:latest"
|
|
||||||
;;
|
|
||||||
"develop" )
|
|
||||||
BRANCHTAG="${DOCKER_IMAGE}:develop"
|
|
||||||
;;
|
|
||||||
* )
|
|
||||||
if [ -n "${{ secrets.LATEST }}" ] ; then
|
|
||||||
if [ "${BRANCHTAG}" = "${{ secrets.LATEST }}" ]; then
|
|
||||||
BRANCHTAG="${DOCKER_IMAGE}:${BRANCH},${DOCKER_IMAGE}:${BRANCH}-latest,${DOCKER_IMAGE}:latest"
|
|
||||||
else
|
|
||||||
BRANCHTAG="${DOCKER_IMAGE}:${BRANCH},${DOCKER_IMAGE}:${BRANCH}-latest"
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
BRANCHTAG="${DOCKER_IMAGE}:${BRANCH},${DOCKER_IMAGE}:${BRANCH}-latest"
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
if [[ $GITHUB_REF == refs/tags/* ]]; then
|
|
||||||
GITTAG="${DOCKER_IMAGE}:$(echo $GITHUB_REF | sed 's|refs/tags/||g')"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -n "${BRANCHTAG}" ] && [ -n "${GITTAG}" ]; then
|
|
||||||
TAGS=${BRANCHTAG},${GITTAG}
|
|
||||||
else
|
|
||||||
TAGS="${BRANCHTAG}${GITTAG}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo ::set-output name=tags::${TAGS}
|
|
||||||
echo ::set-output name=docker_image::${DOCKER_IMAGE}
|
|
||||||
|
|
||||||
- name: Set up QEMU
|
|
||||||
uses: docker/setup-qemu-action@v2
|
|
||||||
with:
|
|
||||||
platforms: all
|
|
||||||
|
|
||||||
- name: Set up Docker Buildx
|
|
||||||
id: buildx
|
|
||||||
uses: docker/setup-buildx-action@v2
|
|
||||||
|
|
||||||
- name: Login to DockerHub
|
|
||||||
if: github.event_name != 'pull_request'
|
|
||||||
uses: docker/login-action@v2
|
|
||||||
with:
|
|
||||||
username: ${{ secrets.DOCKER_USERNAME }}
|
|
||||||
password: ${{ secrets.DOCKER_PASSWORD }}
|
|
||||||
|
|
||||||
- name: Label
|
|
||||||
id: Label
|
|
||||||
run: |
|
|
||||||
if [ -f "Dockerfile" ] ; then
|
|
||||||
sed -i "/FROM .*/a LABEL tiredofit.image.git_repository=\"https://github.com/${GITHUB_REPOSITORY}\"" Dockerfile
|
|
||||||
sed -i "/FROM .*/a LABEL tiredofit.image.git_commit=\"${GITHUB_SHA}\"" Dockerfile
|
|
||||||
sed -i "/FROM .*/a LABEL tiredofit.image.git_committed_by=\"${GITHUB_ACTOR}\"" Dockerfile
|
|
||||||
sed -i "/FROM .*/a LABEL tiredofit.image.image_build_date=\"$(date +'%Y-%m-%d %H:%M:%S')\"" Dockerfile
|
|
||||||
if [ -f "CHANGELOG.md" ] ; then
|
|
||||||
sed -i "/FROM .*/a LABEL tiredofit.db-backup.git_changelog_version=\"$(head -n1 ./CHANGELOG.md | awk '{print $2}')\"" Dockerfile
|
|
||||||
mkdir -p install/assets/.changelogs ; cp CHANGELOG.md install/assets/.changelogs/${GITHUB_REPOSITORY/\//_}.md
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
if [[ $GITHUB_REF == refs/tags/* ]]; then
|
|
||||||
sed -i "/FROM .*/a LABEL tiredofit.image.git_tag=\"${GITHUB_REF#refs/tags/v}\"" Dockerfile
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ $GITHUB_REF == refs/heads/* ]]; then
|
|
||||||
sed -i "/FROM .*/a LABEL tiredofit.image.git_branch=\"${GITHUB_REF#refs/heads/}\"" Dockerfile
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: Build
|
|
||||||
uses: docker/build-push-action@v3
|
|
||||||
with:
|
|
||||||
builder: ${{ steps.buildx.outputs.name }}
|
|
||||||
context: .
|
|
||||||
file: ./Dockerfile
|
|
||||||
platforms: linux/amd64,linux/arm/v7,linux/arm64
|
|
||||||
push: true
|
|
||||||
tags: ${{ steps.prep.outputs.tags }}
|
|
||||||
|
|||||||
111
.github/workflows/manual.yml
vendored
111
.github/workflows/manual.yml
vendored
@@ -1,6 +1,4 @@
|
|||||||
# Manual Workflow (Application)
|
name: "manual_build_image"
|
||||||
|
|
||||||
name: manual
|
|
||||||
|
|
||||||
on:
|
on:
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
@@ -8,104 +6,11 @@ on:
|
|||||||
Manual Build:
|
Manual Build:
|
||||||
description: 'Manual Build'
|
description: 'Manual Build'
|
||||||
required: false
|
required: false
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
docker:
|
build:
|
||||||
runs-on: ubuntu-latest
|
uses: tiredofit/github_actions/.github/workflows/default_amd64_armv7_arm64.yml@main
|
||||||
steps:
|
#uses: tiredofit/github_actions/.github/workflows/default_amd64.yml@main
|
||||||
- name: Checkout
|
#uses: tiredofit/github_actions/.github/workflows/default_amd64_armv7_arm64.yml@main
|
||||||
uses: actions/checkout@v3
|
#uses: tiredofit/github_actions/.github/workflows/default_amd64_arm64.yml@main
|
||||||
|
secrets: inherit
|
||||||
- name: Prepare
|
|
||||||
id: prep
|
|
||||||
run: |
|
|
||||||
DOCKER_IMAGE=${GITHUB_REPOSITORY/docker-/}
|
|
||||||
if [[ $GITHUB_REF == refs/heads/* ]]; then
|
|
||||||
if [[ $GITHUB_REF == refs/heads/*/* ]] ; then
|
|
||||||
BRANCH="${DOCKER_IMAGE}:$(echo $GITHUB_REF | sed "s|refs/heads/||g" | sed "s|/|-|g")"
|
|
||||||
else
|
|
||||||
BRANCH=${GITHUB_REF#refs/heads/}
|
|
||||||
fi
|
|
||||||
|
|
||||||
case ${BRANCH} in
|
|
||||||
"main" | "master" )
|
|
||||||
BRANCHTAG="${DOCKER_IMAGE}:latest"
|
|
||||||
;;
|
|
||||||
"develop" )
|
|
||||||
BRANCHTAG="${DOCKER_IMAGE}:develop"
|
|
||||||
;;
|
|
||||||
* )
|
|
||||||
if [ -n "${{ secrets.LATEST }}" ] ; then
|
|
||||||
if [ "${BRANCHTAG}" = "${{ secrets.LATEST }}" ]; then
|
|
||||||
BRANCHTAG="${DOCKER_IMAGE}:${BRANCH},${DOCKER_IMAGE}:${BRANCH}-latest,${DOCKER_IMAGE}:latest"
|
|
||||||
else
|
|
||||||
BRANCHTAG="${DOCKER_IMAGE}:${BRANCH},${DOCKER_IMAGE}:${BRANCH}-latest"
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
BRANCHTAG="${DOCKER_IMAGE}:${BRANCH},${DOCKER_IMAGE}:${BRANCH}-latest"
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
if [[ $GITHUB_REF == refs/tags/* ]]; then
|
|
||||||
GITTAG="${DOCKER_IMAGE}:$(echo $GITHUB_REF | sed 's|refs/tags/||g')"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -n "${BRANCHTAG}" ] && [ -n "${GITTAG}" ]; then
|
|
||||||
TAGS=${BRANCHTAG},${GITTAG}
|
|
||||||
else
|
|
||||||
TAGS="${BRANCHTAG}${GITTAG}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo ::set-output name=tags::${TAGS}
|
|
||||||
echo ::set-output name=docker_image::${DOCKER_IMAGE}
|
|
||||||
|
|
||||||
- name: Set up QEMU
|
|
||||||
uses: docker/setup-qemu-action@v2
|
|
||||||
with:
|
|
||||||
platforms: all
|
|
||||||
|
|
||||||
- name: Set up Docker Buildx
|
|
||||||
id: buildx
|
|
||||||
uses: docker/setup-buildx-action@v2
|
|
||||||
|
|
||||||
- name: Login to DockerHub
|
|
||||||
if: github.event_name != 'pull_request'
|
|
||||||
uses: docker/login-action@v2
|
|
||||||
with:
|
|
||||||
username: ${{ secrets.DOCKER_USERNAME }}
|
|
||||||
password: ${{ secrets.DOCKER_PASSWORD }}
|
|
||||||
|
|
||||||
- name: Label
|
|
||||||
id: Label
|
|
||||||
run: |
|
|
||||||
if [ -f "Dockerfile" ] ; then
|
|
||||||
sed -i "/FROM .*/a LABEL tiredofit.image.git_repository=\"https://github.com/${GITHUB_REPOSITORY}\"" Dockerfile
|
|
||||||
sed -i "/FROM .*/a LABEL tiredofit.image.git_commit=\"${GITHUB_SHA}\"" Dockerfile
|
|
||||||
sed -i "/FROM .*/a LABEL tiredofit.image.git_committed_by=\"${GITHUB_ACTOR}\"" Dockerfile
|
|
||||||
sed -i "/FROM .*/a LABEL tiredofit.image_build_date=\"$(date +'%Y-%m-%d %H:%M:%S')\"" Dockerfile
|
|
||||||
if [ -f "CHANGELOG.md" ] ; then
|
|
||||||
sed -i "/FROM .*/a LABEL tiredofit.db-backup.git_changelog_version=\"$(head -n1 ./CHANGELOG.md | awk '{print $2}')\"" Dockerfile
|
|
||||||
mkdir -p install/assets/.changelogs ; cp CHANGELOG.md install/assets/.changelogs/${GITHUB_REPOSITORY/\//_}.md
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
if [[ $GITHUB_REF == refs/tags/* ]]; then
|
|
||||||
sed -i "/FROM .*/a LABEL tiredofit.image.git_tag=\"${GITHUB_REF#refs/tags/v}\"" Dockerfile
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ $GITHUB_REF == refs/heads/* ]]; then
|
|
||||||
sed -i "/FROM .*/a LABEL tiredofit.image.git_branch=\"${GITHUB_REF#refs/heads/}\"" Dockerfile
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: Build
|
|
||||||
uses: docker/build-push-action@v3
|
|
||||||
with:
|
|
||||||
builder: ${{ steps.buildx.outputs.name }}
|
|
||||||
context: .
|
|
||||||
file: ./Dockerfile
|
|
||||||
platforms: linux/amd64,linux/arm/v7,linux/arm64
|
|
||||||
push: true
|
|
||||||
tags: ${{ steps.prep.outputs.tags }}
|
|
||||||
|
|||||||
18
CHANGELOG.md
18
CHANGELOG.md
@@ -1,3 +1,21 @@
|
|||||||
|
## 3.7.6 2023-03-14 <toshy@github>
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
- Remove EXTRA_OPT variable from MySQL/MariaDB check
|
||||||
|
|
||||||
|
|
||||||
|
## 3.7.5 2023-03-02 <dave at tiredofit dot ca>
|
||||||
|
|
||||||
|
### Added
|
||||||
|
- Add support for Docker Swarm mode Secrets for BLOBXFER_STORAGE_ACCOUNT_*_FILE
|
||||||
|
|
||||||
|
|
||||||
|
## 3.7.4 2023-02-22 <gbe0@github>
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
- Fix when running in MANUAL_RUN_FOREVER mode looping
|
||||||
|
|
||||||
|
|
||||||
## 3.7.3 2022-12-20 <dave at tiredofit dot ca>
|
## 3.7.3 2022-12-20 <dave at tiredofit dot ca>
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
|
|||||||
16
README.md
16
README.md
@@ -80,7 +80,13 @@ Currently backs up CouchDB, InfluxDB, MySQL, MongoDB, Postgres, Redis servers.
|
|||||||
Clone this repository and build the image with `docker build <arguments> (imagename) .`
|
Clone this repository and build the image with `docker build <arguments> (imagename) .`
|
||||||
|
|
||||||
### Prebuilt Images
|
### Prebuilt Images
|
||||||
Builds of the image are available on [Docker Hub](https://hub.docker.com/r/tiredofit/db-backup) and is the recommended method of installation.
|
Builds of the image are available on [Docker Hub](https://hub.docker.com/r/tiredofit/db-backup)
|
||||||
|
|
||||||
|
Builds of the image are also available on the [Github Container Registry](https://github.com/tiredofit/docker-db-backup/pkgs/container/docker-db-backup)
|
||||||
|
|
||||||
|
```
|
||||||
|
docker pull ghcr.io/tiredofit/docker-db-backup:(imagetag)
|
||||||
|
```
|
||||||
|
|
||||||
The following image tags are available along with their tagged release based on what's written in the [Changelog](CHANGELOG.md):
|
The following image tags are available along with their tagged release based on what's written in the [Changelog](CHANGELOG.md):
|
||||||
|
|
||||||
@@ -89,7 +95,7 @@ The following image tags are available along with their tagged release based on
|
|||||||
| latest | `:latest` |
|
| latest | `:latest` |
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
docker pull tiredofit/db-backup:(imagetag)
|
docker pull docker.io/tiredofdit/db-backup:(imagetag)
|
||||||
```
|
```
|
||||||
#### Multi Architecture
|
#### Multi Architecture
|
||||||
Images are built primarily for `amd64` architecture, and may also include builds for `arm/v7`, `arm64` and others. These variants are all unsupported. Consider [sponsoring](https://github.com/sponsors/tiredofit) my work so that I can work with various hardware. To see if this image supports multiple architecures, type `docker manifest (image):(tag)`
|
Images are built primarily for `amd64` architecture, and may also include builds for `arm/v7`, `arm64` and others. These variants are all unsupported. Consider [sponsoring](https://github.com/sponsors/tiredofit) my work so that I can work with various hardware. To see if this image supports multiple architecures, type `docker manifest (image):(tag)`
|
||||||
@@ -117,7 +123,7 @@ The following directories are used for configuration and can be mapped for persi
|
|||||||
|
|
||||||
#### Base Images used
|
#### Base Images used
|
||||||
|
|
||||||
This image relies on an [Alpine Linux](https://hub.docker.com/r/tiredofit/alpine) or [Debian Linux](https://hub.docker.com/r/tiredofit/debian) base image that relies on an [init system](https://github.com/just-containers/s6-overlay) for added capabilities. Outgoing SMTP capabilities are handlded via `msmtp`. Individual container performance monitoring is performed by [zabbix-agent](https://zabbix.org). Additional tools include: `bash`,`curl`,`less`,`logrotate`, `nano`,`vim`.
|
This image relies on an [Alpine Linux](https://hub.docker.com/r/tiredofit/alpine) or [Debian Linux](https://hub.docker.com/r/tiredofit/debian) base image that relies on an [init system](https://github.com/just-containers/s6-overlay) for added capabilities. Outgoing SMTP capabilities are handlded via `msmtp`. Individual container performance monitoring is performed by [zabbix-agent](https://zabbix.org). Additional tools include: `bash`,`curl`,`less`,`logrotate`, `nano`.
|
||||||
|
|
||||||
Be sure to view the following repositories to understand all the customizable options:
|
Be sure to view the following repositories to understand all the customizable options:
|
||||||
|
|
||||||
@@ -240,7 +246,7 @@ docker exec -it (whatever your container name is) bash
|
|||||||
### Manual Backups
|
### Manual Backups
|
||||||
Manual Backups can be performed by entering the container and typing `backup-now`
|
Manual Backups can be performed by entering the container and typing `backup-now`
|
||||||
|
|
||||||
- Recently there was a request to have the container work with Kukbernetes cron scheduling. This can theoretically be accomplished by setting the container `MODE=MANUAL` and then setting `MANUAL_RUN_FOREVER=FALSE` - You would also want to disable a few features from the upstream base images specifically `CONTAINER_ENABLE_SCHEDULING` and `CONTAINER_ENABLE_MONITORING`. This should allow the container to start, execute a backup by executing and then exit cleanly. An alternative way to running the script is to execute `/etc/services.available/10-db-backup/run`.
|
- Recently there was a request to have the container work with Kubernetes cron scheduling. This can theoretically be accomplished by setting the container `MODE=MANUAL` and then setting `MANUAL_RUN_FOREVER=FALSE` - You would also want to disable a few features from the upstream base images specifically `CONTAINER_ENABLE_SCHEDULING` and `CONTAINER_ENABLE_MONITORING`. This should allow the container to start, execute a backup by executing and then exit cleanly. An alternative way to running the script is to execute `/etc/services.available/10-db-backup/run`.
|
||||||
|
|
||||||
### Restoring Databases
|
### Restoring Databases
|
||||||
Entering in the container and executing `restore` will execute a menu based script to restore your backups - MariaDB, Postgres, and Mongo supported.
|
Entering in the container and executing `restore` will execute a menu based script to restore your backups - MariaDB, Postgres, and Mongo supported.
|
||||||
@@ -338,7 +344,7 @@ If for some reason your filesystem or host is not detecting it right, use the en
|
|||||||
These images were built to serve a specific need in a production environment and gradually have had more functionality added based on requests from the community.
|
These images were built to serve a specific need in a production environment and gradually have had more functionality added based on requests from the community.
|
||||||
### Usage
|
### Usage
|
||||||
- The [Discussions board](../../discussions) is a great place for working with the community on tips and tricks of using this image.
|
- The [Discussions board](../../discussions) is a great place for working with the community on tips and tricks of using this image.
|
||||||
- Consider [sponsoring me](https://github.com/sponsors/tiredofit) personalized support.
|
- Consider [sponsoring me](https://github.com/sponsors/tiredofit) for personalized support
|
||||||
### Bugfixes
|
### Bugfixes
|
||||||
- Please, submit a [Bug Report](issues/new) if something isn't working as expected. I'll do my best to issue a fix in short order.
|
- Please, submit a [Bug Report](issues/new) if something isn't working as expected. I'll do my best to issue a fix in short order.
|
||||||
|
|
||||||
|
|||||||
@@ -104,6 +104,11 @@ bootstrap_variables() {
|
|||||||
file_env 'S3_KEY_ID'
|
file_env 'S3_KEY_ID'
|
||||||
file_env 'S3_KEY_SECRET'
|
file_env 'S3_KEY_SECRET'
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if [ "${BACKUP_LOCATION,,}" = "blobxfer" ] && [ -n "${BLOBXFER_STORAGE_ACCOUNT_FILE}" ] && [ -n "${BLOBXFER_STORAGE_ACCOUNT_KEY_FILE}" ]; then
|
||||||
|
file_env 'BLOBXFER_STORAGE_ACCOUNT_FILE'
|
||||||
|
file_env 'BLOBXFER_STORAGE_ACCOUNT_KEY_FILE'
|
||||||
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
backup_couch() {
|
backup_couch() {
|
||||||
@@ -416,7 +421,7 @@ check_availability() {
|
|||||||
"mysql" )
|
"mysql" )
|
||||||
counter=0
|
counter=0
|
||||||
export MYSQL_PWD=${DB_PASS}
|
export MYSQL_PWD=${DB_PASS}
|
||||||
while ! (mysqladmin -u"${DB_USER}" -P"${DB_PORT}" -h"${DB_HOST}" ${mysql_tls_args} ${EXTRA_OPTS} status > /dev/null 2>&1) ; do
|
while ! (mysqladmin -u"${DB_USER}" -P"${DB_PORT}" -h"${DB_HOST}" ${mysql_tls_args} status > /dev/null 2>&1) ; do
|
||||||
sleep 5
|
sleep 5
|
||||||
(( counter+=5 ))
|
(( counter+=5 ))
|
||||||
print_warn "MySQL/MariaDB Server '${DB_HOST}' is not accessible, retrying.. (${counter} seconds so far)"
|
print_warn "MySQL/MariaDB Server '${DB_HOST}' is not accessible, retrying.. (${counter} seconds so far)"
|
||||||
@@ -831,7 +836,6 @@ setup_mode() {
|
|||||||
if var_true "${MANUAL_RUN_FOREVER}" ; then
|
if var_true "${MANUAL_RUN_FOREVER}" ; then
|
||||||
mkdir -p /etc/services.d/99-run_forever
|
mkdir -p /etc/services.d/99-run_forever
|
||||||
cat <<EOF > /etc/services.d/99-run_forever/run
|
cat <<EOF > /etc/services.d/99-run_forever/run
|
||||||
|
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
while true
|
while true
|
||||||
do
|
do
|
||||||
|
|||||||
Reference in New Issue
Block a user