{"id":24999168,"url":"https://github.com/shixiangwang/sync-deploy","last_synced_at":"2025-04-12T08:04:07.642Z","repository":{"id":98463752,"uuid":"119467219","full_name":"ShixiangWang/sync-deploy","owner":"ShixiangWang","description":":arrows_counterclockwise: shell toolkit for deploying script/command task on remote host, including up/download files, run script on remote","archived":false,"fork":false,"pushed_at":"2020-10-29T03:09:15.000Z","size":76,"stargazers_count":21,"open_issues_count":0,"forks_count":7,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-04-12T08:02:35.224Z","etag":null,"topics":["downloader","pbs","scp","shell-script","ssh","sync-files","uploader"],"latest_commit_sha":null,"homepage":"","language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ShixiangWang.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2018-01-30T01:52:50.000Z","updated_at":"2023-06-17T22:06:40.000Z","dependencies_parsed_at":null,"dependency_job_id":"65c1bb6d-07f4-42bf-8a6d-778f2fffaea2","html_url":"https://github.com/ShixiangWang/sync-deploy","commit_stats":null,"previous_names":[],"tags_count":15,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ShixiangWang%2Fsync-deploy","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ShixiangWang%2Fsync-deploy/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ShixiangWang%2Fsync-deploy/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ShixiangWang%2Fsync-deploy/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ShixiangWang","download_url":"https://codeload.github.com/ShixiangWang/sync-deploy/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248537142,"owners_count":21120709,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["downloader","pbs","scp","shell-script","ssh","sync-files","uploader"],"created_at":"2025-02-04T18:53:44.376Z","updated_at":"2025-04-12T08:04:07.633Z","avatar_url":"https://github.com/ShixiangWang.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# sync deploy 命令工具\n\n[![DOI](https://zenodo.org/badge/119467219.svg)](https://zenodo.org/badge/latestdoi/119467219) [![Open Source Love svg1](https://badges.frapsoft.com/os/v1/open-source.svg?v=103)](https://github.com/ellerbrock/open-source-badges/) [![MIT license](https://img.shields.io/badge/License-MIT-blue.svg)](https://raw.githubusercontent.com/ShixiangWang/sync-deploy/master/LICENSE) [![Maintenance](https://img.shields.io/badge/Maintained%3F-yes-green.svg)](https://GitHub.com/ShixiangWang/sync-deploy/graphs/commit-activity)\n\n[Read in English](README_english.md)\n\n该命令集可以非常方便地向远程主机/服务器上传文件、运行远程脚本、下载文件等。\n\n\u003cdetails\u003e\n\u003csummary\u003e目录\u003c/summary\u003e\n\n1. [sync deploy 命令工具](#sync-deploy-命令工具)\n   1. [目的](#目的)\n   2. [下载与使用](#下载与使用)\n   3. [准备与配置](#准备与配置)\n      1. [查看可用资源与计算节点状态](#查看可用资源与计算节点状态)\n      2. [编写PBS脚本](#编写pbs脚本)\n   4. [命令说明](#命令说明)\n      1. [sync-command](#sync-command)\n      2. [sync-upload](#sync-upload)\n      3. [sync-download](#sync-download)\n      4. [sync-run](#sync-run)\n   5. [sync-template](#sync-template)\n   6. [sync-deploy](#sync-deploy)\n      1. [sync-check](#sync-check)\n   7. [New feature](#new-feature)\n      1. [sync-hostadd](#sync-hostadd)\n      2. [sync-hostdel](#sync-hostdel)\n      3. [sync-switch](#sync-switch)\n      4. [sync-hostlist](#sync-hostlist)\n      5. [PBS脚本批量生成与提交](#pbs脚本批量生成与提交)\n         1. [sync-qgen](#sync-qgen)\n         2. [sync-qsub](#sync-qsub)\n   8. [提交Bug](#提交bug)\n\n\u003c/details\u003e\n\n## 目的\n\n交互式地输入ssh、scp命令进行远端主机命令/脚本的执行、文件的上传与下载并不是很方便，有时候频繁地键入`hostname@ip`也是一件非常痛苦的事情。另外一方面，如果是向计算平台提交任务脚本，在远端文本命令窗口内修改作业参数以及调试运行脚本也是蛮不方便。所以仓库里脚本是为了能够比较方便地执行这一些任务。\n\n命令集内置`ssh`、`scp`、`qsub`、`qstat`命令，分别用于运行远程脚本、命令、上传/下载文件、提交作业和查看作业状态。\n\n## 下载与使用\n\n[点击下载](https://github.com/ShixiangWang/sync-deploy/releases)\n\n或克隆：\n\n```\ngit clone https://github.com/ShixiangWang/sync-deploy.git\n```\n\n下载后执行`add_path.sh`脚本将命令添加到环境路径中，这样无论你处于什么目录都能使用。\n\n```shell\ncd sync-deploy/src\n./add_path.sh\n```\n\n除了`sync-command`命令没有选项，其他命令基本都有选项需要指定。\n\n**对应地，除了`sync-command`其他命令都有`-h`选项，你可以获取帮助**。\n\n```shell\nsync-upload -h\nsync-download -h\nsync-run -h\nsync-template -h\nsync-deploy -h\nsync-check -h\n```\n\n## 准备与配置\n\n首先在服务器端配置本地机器的公钥，以便于实现无密码文件传输。\n\n\n**最简单的方式**是在终端键入`ssh-keygen`然后一路按回车键。\n\n```shell\n$ ssh-keygen\nGenerating public/private rsa key pair.\nEnter file in which to save the key (/c/Users/wangshx/.ssh/id_rsa):\nEnter passphrase (empty for no passphrase):\nEnter same passphrase again:\nYour identification has been saved in /c/Users/wangshx/.ssh/id_rsa.\nYour public key has been saved in /c/Users/wangshx/.ssh/id_rsa.pub.\nThe key fingerprint is:\nSHA256:XaNcpRZHmMp65eHKDzYIzbXYB0ZAb3EHYc7T3azgQD4 wangshx@wsx-liuxslab\nThe key's randomart image is:\n+---[RSA 2048]----+\n|       .o.+ **=  |\n|         = *oB o.|\n|         .E.@ . +|\n|       o Oo@o+ . |\n|      . S.*+o..  |\n|       .....o    |\n|        .o+.     |\n|         .oo     |\n|           ..    |\n+----[SHA256]-----+\n\n```\n\n**如果你使用的是windows7或者10，不知道怎么使用ssh，我推荐你安装`git bash`，windows10用户也可以开启Ubuntu子系统以便于使用。**\n\n将公钥`id_rsa.pub`（本地机器.ssh子目录下）中文本内容拷贝到服务器.ssh子目录中的`authorized_keys`中，放在已有文本后面。如果该文件不存在则创建。\n\n进行测试，如果不需要密码登录则成功。\n\n**然后点击打开当前目录（src/）的`sync-setting`文件，将远程主机的host名与ip地址改为你自己的**。\n\n如果ssh服务还没有开启，请参考\u003chttps://www.linuxidc.com/Linux/2015-01/112045.htm\u003e解决。\n\n*****\n\n**如果你想要在计算平台部署任务**，请点击打开当前目录下的`qsub_header`文件填入PBS参数，设置可以参考[我整理的](https://github.com/ShixiangWang/mytoolkit/blob/master/hpc_info.md)或者百度上的其他资源，例如[1](https://wenku.baidu.com/view/5ab820293169a4517723a3ec.html)，[2](https://wenku.baidu.com/view/14ef7c230722192e4536f6f8.html)等。\n\n\n### 查看可用资源与计算节点状态\n\n在提交任务之前，务必检查一下各个节点的状态，例如资源是否充足，当前有多少正在执行的任务等。\n\n使用\n\n```\n$ pbsnodes -a\n\n```\n\n命令可以显示所有计算节点的状态，如下图。状态为free时计算机空闲。\n\n![pbsnodes](http://bicmr.pku.edu.cn/~wenzw/img/pbsnodes.png)\n\n\n### 编写PBS脚本\n\n我学校提供的说明不是很清楚，我Copy了[某个工作站](http://bicmr.pku.edu.cn/~wenzw/pages/pbs.html)更清晰的描述。\n\n\n一个PBS脚本的模板如下：\n\n```shell\n#!/bin/sh\n#PBS -N \u003c作业名\u003e\n#PBS -a \u003c作业开始运行时间\u003e\n#PBS -l walltime=hh:mm:ss 作业最长运行时间\n#PBS -l nodes=X:ppn=Y 在 X 个节点上申请 Y 个 CPU 核心\n#PBS -l mem=XXmb 申请最大内存为 XX MB\n\n#PBS -q \u003c队列名\u003e\n#PBS -o \u003c标准输出流文件路径\u003e\n#PBS -e \u003c标准错误流输出路径\u003e\n\n# 在输入表示计算任务的命令之前，需要强制设置当前的工作路径\ncd $PBS_O_WORKDIR\n# 设置运行环境\n# 输入要执行的Shell脚本\n\n```\n\n其中，第一行是固定的，表示使用/bin/sh来执行脚本。其余的说明如下：\n\n- 申请资源（例如节点，运行时间等）的选项名为小写的字母‘L’，**不是大写字母‘I’**。\n- 作业开始运行时间的格式为CCYYMMDDHHMM.SS，为了方便，可以直接写HHMM的部分，这样默认的日期就是当前日期。\n- 总共的节点数为 4，每个节点的最大 CPU 核心数量为 48 个，申请时请不要超过最大值。建议**使用pestat命令**查看剩余资源数量，**在确定申请 CPU 核心数量之前，请确认你的程序是否真的需要这些计算资源**。如果程序的并行程度不高，申请过多的 CPU 核心数会造成资源的浪费（多数 CPU 占用率会较低），并且会影响他人使用。在这里我们建议申请的节点数为 1（目前的 MATLAB 不支持跨节点运行），CPU 核心数不超过 24。 PS：**这里说的是该工作站的资源，配置详情请参考官方手册或者询问工作站/计算平台的工作人员。**\n- 当前有两个队列，debug，batch，默认提交到 debug 队列中。\n\n以上的所有#PBS属性均可以不设置，当缺少某属性时，系统将使用默认值。\n\n请在使用时估计自己任务的开销，适量申请计算资源，避免造成资源的浪费。\n\n队列的限制（以下限制均为对每个用户的限制）\n\n| 队列    | 优先度  | 任务最大数 | 默认运行时间   | 最长运行时间   | 备注                |\n| ----- | ---- | ----- | -------- | -------- | ----------------- |\n| debug | 高    | 2     | 00:30:00 | 03:00:00 | 用于提交短期调试任务或者交互式任务 |\n| batch | 低    | 20    | 00:30:00 | ---      | 用于提交批处理任务         |\n\n此外，由于我们的计算资源较少，因此我们对每个用户使用的总计算资源也有限制。\n\n- CPU核心数：同一时间内，单个用户正在运行的任务占用的总核心数限制为 144 。\n\n一个PBS脚本的例子\n\n```shell\n#!/bin/sh\n#PBS -N test\n#PBS -q debug\n#PBS -l nodes=1:ppn=1\n\ncd $PBS_O_WORKDIR\nmodule add gcc/4.8.5\n./hello\n\n```\n\n该脚本任务名为 test，加入到 debug 队列中，申请 1 个节点上的一个 CPU 核心，任务内容为运行指定目录下的 hello 程序。此程序的运行环境为 gcc/4.8.5。\n\n**在`qsub_header`文件中填入所需要的PBS参数后，接着在当前目录的`commands`文件夹填入你要运行的命令。如果你想要运行其他脚本，请在该文件中调用执行**。\n\n## 命令说明\n\n### sync-command\n\n这个命令最简单粗暴，直接在`sync-command`后接你想要在远端执行的命令。\n\n```shell\n$ sync-command ls -l '~/test'\n总用量 0\n-rw-rw-r-- 1 liuxs liuxs  12 1月  30 19:20 job_id\n-rw-rw-r-- 1 liuxs liuxs  34 1月  30 19:20 result.txt\n-rw-rw-r-- 1 liuxs liuxs 110 1月  29 11:40 test.R\n-rwxrw-r-- 1 liuxs liuxs 240 1月  30 19:20 work.sh\n```\n\n**需要注意的是如果是想使用类似`~`这种映射到某个路径的符号，需要添加引号，不然它会被解析为本地地址，那当然会出问题的**\n\n\n### sync-upload\n\n上传文件到远程主机。\n\n用法：\n\n```shell\n    Usage: sync-upload -n local_files -d 'destdir'\n```\n\n`-n`选项后接你要上传的（本地机器）文件/目录路径，`-d`选项接远程主机上的目录路径。\n\n用法示例：\n\n```shell\n==\u003e examples:\n              sync-upload -n work.sh -d /public/home/liuxs/test\n         or\n              sync-upload -n work.sh -d '~/test'\n```\n\n同样注意使用`~`时需要加引号。\n\n**重点注意不支持-n与-d倒过来写，也就是选项是有顺序的**，为什么如此的原因是为了使`-n`选项后能够接大于1个的路径参数，命令脚本内部利用了`-n`和`-d`的位置特点运用正则表达式抓取所有路径名，你可以利用该命令同时上传不止一个文件/目录（也算是有得有失吧）。\n\n### sync-download\n\n从远程主机下载文件到本地机器。\n\n用法：\n\n```shell\n    Usage: sync-download -n 'remote_files' -d localdir\n```\n\n这个命令的使用基本和`sync-upload`一致。\n\n用法示例：\n\n```shell\n==\u003e examples:\n              sync-download -n '~/test/*' -d ./test\n         or\n              sync-download -n /public/home/liuxs/test/* -d ./test\n```\n\n**同样地，不支持`-n`与`-d`选项顺序反着写。**\n\n### sync-run\n\n提交远程主机的作业，内置`qsub`命令向计算平台提交任务脚本。如果只是想要运行远程脚本或命令，请查看`sync-command`命令。\n\n用法：\n\n```shell\n    sync-run -f work_script\n```\n\n`-f`选项后接你要运行的**一个**脚本（需要指定脚本的路径哈）。\n\n用法示例：\n\n```shell\n    sync-run -f /home/wsx/work.sh\n```\n\n## sync-template\n\n生成pbs模板文件，可以指定模板，也可以使用默认模板进行修改。\n\n```\nUsage: sync-template [-f] \u003ctemplate_file\u003e [-n] \u003cpbs_script.pbs\u003e\n```\n\n\n## sync-deploy\n\n上传pbs文件、提交作业一气呵成。\n\n该命令内置调用`sync-upload`和`sync-run`这两个命令，以及其他几个脚本。先通过`sync-template`命令生成模板文件，然后根据任务需求修改`pbs`脚本，最后使用`sync-deploy`提交到任务节点进行运算。\n\n用法：\n\n```shell\n    Usage: sync-deploy -n local_files -d 'destdir'\n```\n\n\n一个实例如下：\n\n```shell\n$ sync-deploy -n work.sh -d '~/test'\n==\u003e command used: scp -pr -P 22 work.sh /home/wsx/working/sync-deploy/src/work.sh liuxs@10.15.22.110:~/test\n==\u003e\nwork.sh                                                                                                         100%  240     0.2KB/s   00:00\n==\u003e Files upload successfully.\n\n==\u003e run as batch mode.......\njob id is\n87728.node1\n==\u003e\n==\u003e The work deploy successfully.\n\n```\n\n### sync-check\n\n用来查看作业状态。\n\n用法：\n\n```shell\n    Usage: sync-check -n id\n```\n\n如果指定`-n`选项加上作业号，会查询指定的作业状态，如果不指定，会查看所有的作业状态。\n\n任务部署后会返回作业号，刚提交了两个作业，我们来查一查。\n\n```shell\n$ sync-check -n 87730\nJob ID                    Name             User            Time Use S Queue\n------------------------- ---------------- --------------- -------- - -----\n87730.node1                work.sh          liuxs           00:00:00 C normal_3\n\n$ sync-check -n 87730.node1\nJob ID                    Name             User            Time Use S Queue\n------------------------- ---------------- --------------- -------- - -----\n87730.node1                work.sh          liuxs           00:00:00 C normal_3\n\n$ sync-check\nJob ID                    Name             User            Time Use S Queue\n------------------------- ---------------- --------------- -------- - -----\n87729.node1                work.sh          liuxs           00:00:00 C normal_3\n87730.node1                work.sh          liuxs           00:00:00 C normal_3\n\n```\n\n## New feature\n\nTo easily work with multiple hosts, `sync-hostadd`, `sync-hostdel` and `sync-switch` has been added to this tool for add/delete and switch host.\n\n### sync-hostadd\n\n```shell\n$ sync-hostadd -h\n\nUsage: sync-hostadd -u host_name -d host_ip -p host_port\n==\u003e examples:\n              sync-hostadd -u wangshx -d 10.15.22.110 -p 22\n```\n\n### sync-hostdel\n\n```shell\n$ sync-hostdel -h\n\nUsage: sync-hostdel -u host_name -d host_ip -p host_port\n==\u003e examples:\n              sync-hostdel -u wangshx -d 10.15.22.110 -p 22\n```\n\n### sync-switch\n\n```shell\n$ sync-switch -h\n\nUsage: sync-switch -u host_name [-d] \u003chost_ip\u003e [-p] \u003chost_port\u003e\n[]\u003c\u003e mark optional argument and corresponding value.\n==\u003e examples:\n              sync-switch -u wangshx -d 10.15.22.110 -p 22\n```\n\n### sync-hostlist\n\n没有参数，列出可用和保存的所有主机列表。\n\n```shell\n$ sync-hostlist\n\u003e\u003e\u003e Current Host\nuser=wangshx\nip=10.15.22.110\nport=22\n\n\u003e\u003e\u003e Available Hosts:\nliuxs,10.15.22.110,22\nwangshx,10.15.22.110,22\n```\n\n\n\n### PBS脚本批量生成与提交\n\n有时候为每一个处理的样本（对）提交一个pbs确实可以带来极大的便利，下面两个命令参考@[BioAmelie](https://github.com/BioAmelie)的一些想法和代码编写而成。\n\n#### sync-qgen\n\n命令说明，`-h`选项可以获取帮助：\n\n```shell\n$ ./sync-qgen -h\n\nUsage: sync-qgen -f template -s samplefile -m mapfile -d outdir\n\u003e\u003e\u003e template: a pbs template file.\n\u003e\u003e\u003e samplefile: a csv file with columns used to iterate.\n\u003e\u003e\u003e mapfile: a csv file contains mapping between labels and column index (0-based) in samplefile.\n\u003e\u003e\u003e outdir: output directory.\n```\n\n这里template是一个pbs模板，samplefile则是一个包含1列及以上的csv文件，第一列必须为处理样本的id或唯一的Job id，mapfile是一个包含1行及以上的csv文件，**第一列标定pbs模板中要更改（替换）的标签，如`\u003chead\u003e`，第2列则标定替换后的标签，为samplefile的（基于0）整数索引，即0表示替换`\u003chead\u003e`为samplefile的第1列**，最后outdir指定存储pbs的目录（命令会自动创建目录，最好每个任务新建一个）。\n\n下面是测试：\n\n```shell\n$ cd test-pbs\n$ ../src/sync-qgen -f pbs-template -s samplefile -m mapping -d pbs\n\nParsing parameters...\n=====================\nPBS Template: pbs-template\nSample file : samplefile\nMapping file: mapping\nOutput path : pbs\n\n\nWorking...\n  Modify \u003chead\u003e to TCGA-2A-A8VO-01\n  Modify \u003chead2\u003e to TCGA-2A-A8VO-01-01\n  Modify \u003chead\u003e to TCGA-2A-A8VT-01\n  Modify \u003chead2\u003e to TCGA-2A-A8VT-01-01\n  Modify \u003chead\u003e to TCGA-2A-A8VV-01\n  Modify \u003chead2\u003e to TCGA-2A-A8VV-01-01\n  Modify \u003chead\u003e to TCGA-2A-A8VX-01\n  Modify \u003chead2\u003e to TCGA-2A-A8VX-01-01\nDone.\n\n```\n\n#### sync-qsub\n\n这个命令配合`sync-qgen`输出的目录使用，它批量把pbs提交上去。\n\n```shell\n$ ./sync-qsub -h\n\nUsage: sync-qsub -d pbs_dir\n\u003e\u003e\u003e pbs_dir: a directory store submitting pbs files.\n\n```\n\n## 提交Bug\n\n有问题欢迎[提交issue](https://github.com/ShixiangWang/sync-deploy/issues)进行讨论。\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fshixiangwang%2Fsync-deploy","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fshixiangwang%2Fsync-deploy","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fshixiangwang%2Fsync-deploy/lists"}