ln并不总是通过SSH工作
ln not always working over SSH
我正在使用 GitLab 的 CD 制作部署脚本。我有一个脚本:
- ssh USER@HOST "cd domains/$DOMAIN/ && mkdir build-$CI_JOB_ID"
- rsync -ar --port=22 * USER@HOST :domains/$DOMAIN/build-$CI_JOB_ID
- ssh USER@HOST "cd domains/$DOMAIN/ && ln -sfv build-$CI_JOB_ID/public public_html && ls -la"
- ssh USER@HOST "cd domains/$DOMAIN/ && ls | grep '^build\-.*$' | grep -Ev '^build-$CI_JOB_ID$' | xargs rm -rf"
一切正常,但 ln
命令无效。它只有 50% 的时间有效。这是一个接一个运行的作业的日志。
$CI_JOB_ID = 76337215
的作业 1 工作正常。 Link 正确。
$ ssh USER@HOST "cd domains/$DOMAIN/ && ln -sfv build-$CI_JOB_ID/public public_html && ls -la"
public_html -> build-76337215/public
total 20
drwx--x--x 5 USER 1000 7 Jun 20 22:15 .
drwx--x--x 23 USER 1000 23 Jun 19 16:34 ..
-rw-r--r-- 1 USER 1000 39 Jun 17 22:12 .htaccess
drwxr-xr-x 12 USER 1000 20 Jun 20 22:07 build-76335972
drwxr-xr-x 12 USER 1000 20 Jun 20 22:14 build-76337215
drwxr-xr-x 2 USER 1000 4 Jun 20 11:48 logs
lrwxr-xr-x 1 USER 1000 21 Jun 20 22:15 public_html -> build-76337215/public
作业 2 $CI_JOB_ID = 76339729
没有成功。 Link 仍然是作业 1 中的旧 76337215
。
$ ssh USER@HOST "cd domains/$DOMAIN/ && ln -sfv build-$CI_JOB_ID/public public_html && ls -la"
public_html/public -> build-76339729/public
total 20
drwx--x--x 5 USER 1000 7 Jun 20 22:28 .
drwx--x--x 23 USER 1000 23 Jun 19 16:34 ..
-rw-r--r-- 1 USER 1000 39 Jun 17 22:12 .htaccess
drwxr-xr-x 12 USER 1000 20 Jun 20 22:14 build-76337215
drwxr-xr-x 12 USER 1000 20 Jun 20 22:28 build-76339729
drwxr-xr-x 2 USER 1000 4 Jun 20 11:48 logs
lrwxr-xr-x 1 USER 1000 21 Jun 20 22:15 public_html -> build-76337215/public
我做错了什么?为什么它不是 100% 的时间工作?
问题是,如果 public_html
已经存在并且是一个目录(或者是目录的符号 link),那么您的 ln
命令会创建一个新的 link 在该目录中,而不是替换 public_html
.
使用 -T
选项来避免这种情况:
ln -sfTv build-$CI_JOB_ID/public public_html
或者,您可以使用 -n
选项不取消引用 link
ln -sfnv build-$CI_JOB_ID/public public_html
如果它是 symlink,这将替换 public_html
,如果它是真实目录,则在子目录中创建 symlink(-T 会在后一种情况)。
我正在使用 GitLab 的 CD 制作部署脚本。我有一个脚本:
- ssh USER@HOST "cd domains/$DOMAIN/ && mkdir build-$CI_JOB_ID"
- rsync -ar --port=22 * USER@HOST :domains/$DOMAIN/build-$CI_JOB_ID
- ssh USER@HOST "cd domains/$DOMAIN/ && ln -sfv build-$CI_JOB_ID/public public_html && ls -la"
- ssh USER@HOST "cd domains/$DOMAIN/ && ls | grep '^build\-.*$' | grep -Ev '^build-$CI_JOB_ID$' | xargs rm -rf"
一切正常,但 ln
命令无效。它只有 50% 的时间有效。这是一个接一个运行的作业的日志。
$CI_JOB_ID = 76337215
的作业 1 工作正常。 Link 正确。
$ ssh USER@HOST "cd domains/$DOMAIN/ && ln -sfv build-$CI_JOB_ID/public public_html && ls -la"
public_html -> build-76337215/public
total 20
drwx--x--x 5 USER 1000 7 Jun 20 22:15 .
drwx--x--x 23 USER 1000 23 Jun 19 16:34 ..
-rw-r--r-- 1 USER 1000 39 Jun 17 22:12 .htaccess
drwxr-xr-x 12 USER 1000 20 Jun 20 22:07 build-76335972
drwxr-xr-x 12 USER 1000 20 Jun 20 22:14 build-76337215
drwxr-xr-x 2 USER 1000 4 Jun 20 11:48 logs
lrwxr-xr-x 1 USER 1000 21 Jun 20 22:15 public_html -> build-76337215/public
作业 2 $CI_JOB_ID = 76339729
没有成功。 Link 仍然是作业 1 中的旧 76337215
。
$ ssh USER@HOST "cd domains/$DOMAIN/ && ln -sfv build-$CI_JOB_ID/public public_html && ls -la"
public_html/public -> build-76339729/public
total 20
drwx--x--x 5 USER 1000 7 Jun 20 22:28 .
drwx--x--x 23 USER 1000 23 Jun 19 16:34 ..
-rw-r--r-- 1 USER 1000 39 Jun 17 22:12 .htaccess
drwxr-xr-x 12 USER 1000 20 Jun 20 22:14 build-76337215
drwxr-xr-x 12 USER 1000 20 Jun 20 22:28 build-76339729
drwxr-xr-x 2 USER 1000 4 Jun 20 11:48 logs
lrwxr-xr-x 1 USER 1000 21 Jun 20 22:15 public_html -> build-76337215/public
我做错了什么?为什么它不是 100% 的时间工作?
问题是,如果 public_html
已经存在并且是一个目录(或者是目录的符号 link),那么您的 ln
命令会创建一个新的 link 在该目录中,而不是替换 public_html
.
使用 -T
选项来避免这种情况:
ln -sfTv build-$CI_JOB_ID/public public_html
或者,您可以使用 -n
选项不取消引用 link
ln -sfnv build-$CI_JOB_ID/public public_html
如果它是 symlink,这将替换 public_html
,如果它是真实目录,则在子目录中创建 symlink(-T 会在后一种情况)。