JATOS安装学习记录

Introduction to JATOS

一些在线的互动任务可以借鉴这个网站上的示例

https://volunteerscience.com/experiments/templates/

https://www.jatos.org/Whats-JATOS.html

JATOS (Just Another Tool for Online Studies) helps you set up and run your online studies on your own server.

在服务器上安装JATOS的坑

最大的坑居然是我在production.conf中设置ip地址时用的是公网ip,而不是私网ip;折腾了两天。

如何让程序在linux服务器下一直运行

(关闭远程连接后仍然继续运行)

在Linux/Unix中,有这样几个概念:

进程组(process group):一个或多个进程的集合,每一个进程组有唯一一个进程组ID,即进程组长进程的ID。

会话期(session):一个或多个进程组的集合,有唯一一个会话期首进程(session leader)。会话期ID为首进程的ID。

会话期可以有一个单独的控制终端(controlling terminal)。与控制终端连接的会话期首进程叫做控制进程(controlling process)。当前与终端交互的进程称为前台进程组。其余进程组称为后台进程组。

解决方案

这里主要有三个方案,一个是使用nohup指令,一个是使用screen指令,最后一个是screen的升级版byobu。看完这三个指令之后其实我更倾向于使用byobu指令,因为byobu指令更加的强大,是screen的升级版本,并且界面也比较友好。「我目前使用的是nohup命令」

https://www.cnblogs.com/yychuyu/p/13159338.html

在工作中,我们很经常跑一个很重要的程序,有时候这个程序需要跑好几个小时,甚至需要几天,这个时候如果我们退出终端,或者网络不好连接中断,那么程序就会被中止。而这个情况肯定不是我们想看到的,我们希望即使终端关闭,程序依然可以在跑。

这时我们就可以使用 nohup 这个命令。

nohup 命令是英语词组 no hangup 的缩写,意思是不挂断,也就是指程序不退出。这个命令会使程序忽略 HUP 信号,保证程序能够正常进行。HUP 信号有些人可能比较陌生,它是在终端被中止的时候向它所关联的进程所发出的信号,进程收到这个信号后就会中止运行。所以如果你不希望进程被这个信号干掉的话,就可以忽略这个信号。而 nohup 命令做的就是这个事情。

nohup --version
#nohup 命令的基本语法如下:
nohup command arguments

重定向程序的输出

如果我不想把程序的输出保存在家目录或者当前目录,我想保存在我指定的路径,并且自定义文件名,要怎么操作?这时我们就可以使用重定向操作 >

比如,我现在有个脚本 myScript.sh 我想把它的输出保存在家目录下的 output 目录下,文件名为 myOutput.txt ,可以这样运行:

nohup ./myScript.sh > ~/output/myOutput.txt

使用nohup命令后台启动一个程序

如果想让程序在后台运行,可以加上 & 符号。但这样运行之后,程序就无影无踪了。想要让程序重新回到终端,可以使用 fg 命令。

使用nohup同时运行多个程序

如果你需要同时跑多个程序,没必要一个个运行,直接使用 && 符号即可。比如,你想同时跑 mkdir ,ping,ls 三个命令,可以这样运行:

nohup bash -c 'mkdir files && ping -c 1 baidu.com && ls'> output.txt
  1. 使用nohup命令

描述:nohup 命令运行由 Command 参数和任何相关的 Arg 参数指定的命令,忽略所有挂断(SIGHUP)信号。在注销后使用 nohup 命令运行后台中的程序。要运行后台中的 nohup 命令,添加 & ( 表示”and”的符号)到命令的尾部。

nohup java ChatServer > ChatServer.file 2>&1 &

## 在我的服务器上启动jatos的命令
nohup /root/Online_experiment/jatos/loader.sh start & 
#后台运行,可以加上 & 符号

上面有提到,nohup 命令结合 & 符号可以使进程在后台运行,即使关闭了终端依然不受影响。这时,如果想要终止这个进程,要怎么操作呢?

最简单的当属 kill 命令,相信大家用过很多次了。

kill -9 PID

那要如何找到进程对应的 pid 呢?我们可以使用 ps 命令。

ps aux | grep loader.sh

pgrep -a loader.sh

164316 /bin/bash /root/Online_experiment/jatos/loader.sh start

root 164316 0.0 0.1 13068 2760 ? S Aug16 0:00 /bin/bash /root/Online_experiment/jatos/loader.sh start

root 2575267 0.0 0.0 12136 1156 pts/1 S+ 10:40 0:00 grep –color=auto loader.sh

kill -9 164316 
kill -9 2575267 #运行后jatos就无法访问了

可以使用pm2进行进程控制

pm2 start app.sh                //脚本启动
pm2 start /root/Online_experiment/jatos/loader.sh -- start(发现要加上参数-- start)

cd /root/Online_experiment/jatos/
pm2 start loader.sh -- start            //脚本启动
pm2 start loader.sh -- start              //脚本启动(要加上参数-- start)



pm2 start loader.sh -- start --watch //当文件发生变化,自动重启

pm2 stop loader.sh 

使用PM2管理运行进程(nodeGame为例)

PM2 is a daemon process manager that will help you manage and keep your application online.

https://pm2.keymetrics.io/docs/usage/quick-start/

https://www.jianshu.com/p/c4176b862c84PM2

(Process Manager 2 )是具有内置负载均衡器的Node.js应用程序的生产运行时和进程管理器。 它允许您永久保持应用程序活跃,无需停机即可重新加载它们,并促进常见的Devops任务。

pm2 start app.js                //启动app.js应用
pm2 start app.js --name demo    //启动应用并设置name
pm2 start app.sh                //脚本启动

pm2 stop all               //停止所有应用
pm2 stop [AppName]        //根据应用名停止指定应用
pm2 stop [ID]             //根据应用id停止指定应用

pm2 delete all               //关闭并删除应用
pm2 delete [AppName]        //根据应用名关闭并删除应用
pm2 delete [ID]            //根据应用ID关闭并删除应用

##创建开机自启动
pm2 startup
##pm2 startup centos 

##更新PM2
pm2 updatePM2
pm2 update

##监听模式
pm2 start app.js --watch    //当文件发生变化,自动重启

##重新启动
//同时杀死并重启所有进程。短时间内服务不可用。生成环境推荐使用reload
pm2 restart app.js

##0秒停机重新加载
pm2 reload app.js        //重新启动所有进程,始终保持至少一个进程在运行
pm2 gracefulReload all   //优雅地以群集模式重新加载所有应用程序

##查看启动列表
pm2 list

##显示应用程序所有信息
pm2 show [Name]      //根据name查看
pm2 show [ID]        //根据id查看

##保存当前应用列表
pm2 save


pm2 start app.js 

Install PM2

  1. pm2 is a free process manager, a program that will take care of keeping nodeGame always running. To install: npm install pm2 -g.
  2. Go to the nodegame installation directory and type: pm2 start launcher.js.
  3. To stop the server type: pm2 stop launcher.
  4. To restart your server: pm2 restart launcher.
  5. To see info about your server: pm2 info launcher.

最后都采用pm2管理jatos和nodegame进程了。

CentOS 查看运行进程

可以使用ps命令。它能显示当前运行中进程的相关信息,包括进程的PID。 Linux和UNIX都支持ps命令,显示所有运行中进程的相关信息。

ps aux | less
a:显示终端中包括其它用户的所有进程
u:以用户为主的进程状态
x:显示无控制终端的进程
x通常与 a 这个参数一起使用,显示当前用户在所有终端下的进程信息

最常用的方法是ps aux,然后再通过管道使用grep命令过滤查找特定的进程,然后再对特定的进程进行操作。
ps aux | grep program_filter_word, ps -ef |grep tomcat
执行“ps -elf”命令,将以长格式显示系统的进程信息,并包含更丰富的内容。

ps -ef|grep java|grep -v grep 显示出所有的java进程,并去处掉当前的grep进程。

CentOS 7 查看和控制进程

第一行列表标题各字段的含义

CentOS 7 查看和控制进程


top命令
top命令将会在当前终端以全屏交互式的界面显示进程排名,及时跟踪CPU、内存等系统资源占用情况,默认情况下每三秒刷新一次,其作用类似于windows系统中的任务管理器。

pgrep命令
使用pgrep命令可以根据进程的名称、运行该进程的用户、进程所在的终端等多中属性查询特定进程的PID号。

https://blog.csdn.net/wojiaopanpan/article/details/7286430

改变进程的运行方式

Ctrl+z:挂起当前进程
jobs -l:查看后台进程
fg:恢复进程
kill -9:结束进程
kill -9 vim #-9  强行终止进程




CentOS nginx配置教程

https://juejin.cn/post/6844904134345228301

## 输入以下命令来安装 Nginx:
sudo yum install nginx
#使用 yum 进行 Nginx 安装时,Nginx 配置文件在 /etc/nginx 目录下。

sudo yum remove nginx  # 卸载 nginx

## 设置Ngin开机启动:
sudo systemctl enable nginx

### 启动 Nginx:
sudo systemctl start nginx

sudo service nginx stop # 停止 nginx 服务

sudo service nginx restart # 重启 nginx 服务

sudo service nginx reload # 重新加载配置,一般是在修改过 nginx 配置文件时使用。

### 检查 Nginx 的运行状态:
sudo systemctl status nginx

nginx -t ##检查配置文件是否正确

In the end, you will get two files: a certificate and a key. What to do with them depends on how you decide to handle HTTPS connections. You can let nodeGame handle them directly without installing additional software. Alternatively, you can install Nginx, an open source web server known for its efficiency and robustness. If you have admin rights to install Nginx, this is the recommended choice. Both options are explained below.

#上传本地生的证书到服务器
#scp /path/filename  username@serverIp:/path

##www.scmdlab.cn的证书
scp /Users/yuanbo/Downloads/Online_experiments/域名https证书/www.scmdlab.cn/Nginx/1_www.scmdlab.cn_bundle.crt 
root@1.13.2.85:/etc/ssl/certs/

scp  /Users/yuanbo/Downloads/Online_experiments/域名https证书/www.scmdlab.cn/Nginx/2_www.scmdlab.cn.key root@1.13.2.85:/etc/ssl/private/

##exp.scmdlab.cn的证书
scp /Users/yuanbo/Downloads/Online_experiments/域名https证书/exp.scmdlab.cn/Nginx/1_exp.scmdlab.cn_bundle.crt  root@1.13.2.85:/etc/ssl/certs/

scp /Users/yuanbo/Downloads/Online_experiments/域名https证书/exp.scmdlab.cn/Nginx/2_exp.scmdlab.cn.key root@1.13.2.85:/etc/ssl/private/


##blog.scmdlab.cn的证书
scp /Users/yuanbo/Downloads/Online_experiments/域名https证书/blog.scmdlab.cn/Nginx/1_blog.scmdlab.cn_bundle.crt  root@1.13.2.85:/etc/ssl/certs/

scp /Users/yuanbo/Downloads/Online_experiments/域名https证书/blog.scmdlab.cn/Nginx/2_blog.scmdlab.cn.key root@1.13.2.85:/etc/ssl/private/





#ssl_certificate      /etc/ssl/certs/localhost.crt;
#ssl_certificate_key  /etc/ssl/private/localhost.key;

nginx配置文件


sudo vi /etc/nginx/nginx.conf


        # redirect http to https
        server {
                listen      80;
                server_name www.scmdlab.cn exp.scmdlab.cn;
                # server_name localhost;
                # rewrite ^/(.*) https://www.scmdlab.cn/$1 permanent; #rewrite all http requests to be https requests
                rewrite     ^ https://www.scmdlab.cn$request_uri? permanent; ## redirect http to https

        }

        ## jatos --> www.scmdlab.cn
        server {
                listen        443 ssl;
                server_name   www.scmdlab.cn;
                # server_name localhost;

                keepalive_timeout    70;

                ssl_certificate      /etc/ssl/certs/1_www.scmdlab.cn_bundle.crt;
                ssl_certificate_key  /etc/ssl/private/2_www.scmdlab.cn.key;

                ssl_protocols             TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
                ssl_prefer_server_ciphers on;

                # websocket location (JATOS' group and batch channel and the test page)
                location ~ "/(jatos/testWebSocket|publix/[\d]+/(group/join|batch/open))" {
                        proxy_pass              http://jatos-backend;
                        proxy_http_version      1.1;
                        proxy_set_header        Upgrade $http_upgrade;
                        proxy_set_header        Connection $connection_upgrade;
                        proxy_connect_timeout   7d; # keep open for 7 days even without any transmission
                        proxy_send_timeout      7d;
                        proxy_read_timeout      7d;
                }       

                # all other traffic
                location / {
                        # proxy_pass            http://1.13.2.85:9000;
                        proxy_pass              http://jatos-backend;
                        proxy_connect_timeout   300;
                        proxy_send_timeout      300;
                        proxy_read_timeout      300;
                        send_timeout            300;
                }
                
        }

         ## nodegame --> exp.scmdlab.cn
         server {
                listen        443 ssl;
                server_name   exp.scmdlab.cn;
                # server_name localhost;

                keepalive_timeout    70;

                ssl_certificate      /etc/ssl/certs/1_exp.scmdlab.cn_bundle.crt;
                ssl_certificate_key  /etc/ssl/private/2_exp.scmdlab.cn.key;

                ssl_protocols             TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
                ssl_prefer_server_ciphers on;
      


                # nodegame
                # location /nodegame  {
                #         proxy_pass http://localhost:8080;
                #         proxy_http_version 1.1;
                #         proxy_set_header Upgrade $http_upgrade;
                #         proxy_set_header Connection 'upgrade';
                #         proxy_cache_bypass $http_upgrade;

                # } 
                location / {
                        proxy_pass http://127.0.0.1:8080/;
                        # proxy_http_version 1.1;
                        # proxy_set_header Upgrade $http_upgrade;
                        # proxy_set_header Connection 'upgrade';
                        # proxy_cache_bypass $http_upgrade;

                        proxy_read_timeout  300;
                        proxy_connect_timeout   300;
                        proxy_redirect  off;

                        proxy_set_header    X-Forwarded-Proto $scheme;
                        proxy_set_header    Host          $http_host;
                        proxy_set_header    X-Real-IP     $remote_addr;

                }            
                
        }       


在 Nginx 中配置二级域名 https://mincong.io/cn/nginx-subdomains/

这两天在研究如何通过 Nginx 来配置二级域名(subdomains),觉得挺有意思的,想跟大家分享一下。我在一个机器部署多个子域名的原因很简单,就是因为:穷。。。没钱买服务器,于是想把多个服务部署在同一台机器上面,通过 Nginx 来实现。阅读本文后,你会明白:

  • 如何在阿里云配置关于 DNS 的“域名解析”
  • 如何在 Nginx 中配置 HTTP 的重定向(redirection)
  • 如何在 Nginx 中配置部署多个子域名(subdomains)
  • 如何在后续阶段,部署新的子域名
ssl_certificate      /path/to/fullchain.cer;
ssl_certificate_key  /path/to/cert.key;

server {
    listen       443 ssl;
    server_name  www.jimidata.fr;
    root         /app/jimi/www.jimidata.fr;
    index        index.html;
}

server {
    listen       443 ssl;
    server_name  api.jimidata.fr;
    root         /app/jimi/api.jimidata.fr;
    index        index.html;
}

server {
    listen       443 ssl;
    server_name  blog.jimidata.fr;
    root         /app/jimi/blog.jimidata.fr;
    index        index.html;
}

nginx 请求的时候 500错误 failed (13: Permission denied)

在使用jatos导入study时发现nginx 请求的时候 500错误,后来排查nginx的日志error.log 发现

2021/09/10 19:44:07 [crit] 1671940#0: *2 open() "/var/lib/nginx/tmp/client_body/0000000001" failed (13: Permission denied), client: 39.190.202.1, server: www.scmdlab.cn, request: "POST /jatos/import/study HTTP/1.1", host: "www.scmdlab.cn", referrer: "https://www.scmdlab.cn/jatos"
2021/09/10 19:44:59 [crit] 1672210#0: *2 open() "/var/lib/nginx/tmp/client_body/0000000001" failed (13: Permission denied), client: 39.190.202.1, server: www.scmdlab.cn, request: "POST /jatos/import/study HTTP/1.1", host: "www.scmdlab.cn", referrer: "https://www.scmdlab.cn/jatos/4"
2021/09/10 19:51:36 [crit] 1672210#0: *134 open() "/var/lib/nginx/tmp/client_body/0000000002" failed (13: Permission denied), client: 39.190.202.1, server: www.scmdlab.cn, request: "POST /jatos/import/study HTTP/1.1", host: "www.scmdlab.cn", referrer: "https://www.scmdlab.cn/jatos/2"

参考这个bloghttps://blog.csdn.net/poem_2010/article/details/93654387,推测可能是文件权限问题。因为在nginx的配置文件中我使用的user nobody,这个可能导致没有root权限,然后将配置文件中的语句修改为user root; 重新运行没有上述500错误。

Centos查看端口占用情况和开启端口命令

#Centos查看端口占用情况命令,比如查看80端口占用情况使用如下命令:
lsof -i tcp:80
#netstat -ntlp
netstat -ntlp

#检查端口被哪个进程占用
netstat -lnp|grep 80   #88请换为你的apache需要的端口,如:80

使用iTerm2通过SSH连接远程服务器

经常和服务器打交道,免不了要远程连接服务器,怎么使用iterm2连接服务器,网上一搜一大把。但由于iterm2默认不能使用rz指令上传文件,以及我现在公司远程登录测试服务器,采用的方案是需要先通过跳板机登录。而且往往都会为每一位开发配置一个token,动态的产生一个6位的数字串,用来作为登录密码。  网上的一些方法总会不那么完美,在这里做个整理,顺便结合我的测试,提供一个我自己实践出来的完美解决方案。

https://zhuanlan.zhihu.com/p/180500618

https://cloud.tencent.com/developer/article/1744789

  • 首先是在terminal 里使用ssh远程登录
ssh root@1.13.2.85 -p 22

输入上面命令,然后输入服务器密码即可

  • 下面是iTerm2通过SSH连接远程服务器
首先
cd ~/.ssh/

然后
subl work.sh

#!/usr/bin/expect -f
set user username
set host 0.0.0.0
set password keys
set timeout -1
spawn ssh -XY $user@$host
expect "*assword:*"
send "$password\r"
interact
expect eof

#expect "*assword:*"和send "$password\r"好像可以注释掉,目前没发现影响



#!/usr/bin/expect -f
set user root
set host 1.13.2.85
set password YUANBObq0501!
set timeout -1
spawn ssh -XY $user@$host
expect "*assword:*"
send "$password\r"
interact
expect eof

#expect "*assword:*"和send "$password\r"好像可以注释掉,目前没发现影响

但是,问题又来了,虽然这样可以顺利登录进去,但是细心的人会发现这样登录存在一个问题,就是当终端窗口改变大小时,远程服务器并不会随之改变,所显示的区域还是一开始的大小,如下所示:

查找好多方法,终于找到原因所在,原来是因为设置自动登录时使用了expect,它无法检测到窗口改变,也就无法跟踪窗口,所以需要在原来代码的基础上加上如下几句:

#!/usr/bin/expect -f
#trap sigwinch spawned
  trap {
    set cols [stty columns]
    set cols [stty columns]
    stty rows $rows columns $cols < $spawn_out(slave,name)
   } WINCH
   

设置VS coder Remote ssh

Mac 电脑上设置VS coder Remote ssh,主要参考这篇blog

https://blog.csdn.net/weixin_42902669/article/details/102610799

github设置添加SSH

https://www.jianshu.com/p/5cd341bddae6

1. 本地Mac电脑上生成密钥

「这部分相当于我已经做过了,以后配置可以跳过」

新的Mac Book Pro上需要新生成密钥

cd ~/.ssh
ssh-keygen -t rsa -C "备注信息,可写可不写"   # 生成公钥、私钥对
ssh-add id_rsa

pbcopy < ~/.ssh/id_rsa.pub


其中:

  • ssh-keygen -t rsa 会生成两个文件:id_rsaid_rsa.pub
  • id_rsa 为私钥; id_rsa.pub 为公钥
  • ssh-add 的作用只是把我们的私钥添加到 ssh-agent 所管理的一个 session 当中。(具体参考: 是否必须每次添加ssh-add)
  • pbcopy 一个特殊的管道复制命令,等下可以直接在 iTerm2 中用 CMD + V 来粘贴。

参考下面的一部分进行公钥的拷贝。

2. 上传密钥到服务器端

先登录到远程服务器,修改 .ssh 文件夹权限

chmod 700 ~/.ssh 

将本地生成的 authorized_keys 文件上传到服务器 ~/.ssh 目录下, 并修改权限

将本地生成的 authorized_keys 文件上传到服务器 ~/.ssh 目录下, 并修改权限


chmod 600 ~/.ssh/authorized_keys 

## 重启 sshd 进程
sudo service sshd restart

3. 配置 VS Code Insiders

VS Code Insiders 中安装 Remote-SSH 插件之后, 按 F1, 在输入框输入ssh, 找到下面标出的配置文件

在文件中写入以下几行配置项

在CentOS上配置VS coder Remote ssh方式参考如下

https://booox.github.io/2017/10/30/Mac-ssh-Aliyun/

https://zhuanlan.zhihu.com/p/36841263

主要是用公钥与私钥来完成验证;首先在本地的Mac电脑上拷贝已生成的公钥。

pbcopy < ~/.ssh/id_rsa.pub
#这里复制的内容后面要用到。

然后在登录到的远程服务器上配置公钥

$ vi ~/.ssh/authorized_keys

#将前面复制的 id_rsa.pub 的内容,粘贴到这里 先按 ESC,再输入 :wq 后保存退出。

#设置权限
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

#测试是否可以用公钥/私钥对验证 如果可以,则将密码验证也去掉:
PasswordAuthentication no


重启 sshd 进程
service shd restart




最后,按照vs coder安装Remote ssh插件,并配置ssh文件

## 配置文件在/Users/yuanbo/.ssh/cofig

## 设置不让ssh那么容易断开连接
Host *
    ServerAliveInterval 60

Host Tencent-server 
    User root
    HostName 1.13.2.85
    Port 22
    IdentityFile "/Users/yuanbo/.ssh/id_rsa" #Mac本地私钥地址
## ssh服务的一些命令
systemctl restart sshd.service
systemctl status sshd.service #查看ssh服务的状态
systemctl start sshd.service  #开启ssh服务

查看CentOS开放端口的方法

Centos升级到7之后,内置的防火墙(软件防火墙)已经从iptables变成了firewalld。所以,端口的开启还是要从两种情况来说明的,即iptables和firewalld。下面是centos7上的命令


#firewalld(centos7)

#启动防火墙
systemctl start firewalld 
#禁用防火墙
systemctl stop firewalld
#设置开机启动
systemctl enable firewalld
#停止并禁用开机启动
sytemctl disable firewalld
#重启防火墙
firewall-cmd --reload

#查看状态
systemctl status firewalld
#查看防火墙状态的简单命令是:
firewall-cmd --state

#查看版本
firewall-cmd --version

#查看指定区域所有打开的端口
firewall-cmd --zone=public --list-ports

#在指定区域打开端口(记得重启防火墙)
firewall-cmd --zone=public --add-port=80/tcp(永久生效再加上 --permanent)

#开放端口
1.查看已开放的端口(默认不开放任何端口)
firewall-cmd --list-ports
2.开启80端口
firewall-cmd --zone=public(作用域) --add-port=80/tcp(端口和访问类型) --permanent(永久生效)
firewall-cmd --zone=public --add-port=80/tcp --permanent
3.重启防火墙
firewall-cmd --reload

防火墙未运行时:

在这里插入图片描述

Linux系统服务器常用操作

查看文件详细

#我们知道在终端输入ll,就可以显示当前目录里的文件详细信息,或者使用ls加上另外的参数就可以显示其他的一些有用的信息
ls
ll

ls -lh #显示的的大小更具可读性


查看本地ip

hostname -I
#hostname -I (大写字母I,就是爱德荷州Idaho的首字母)。如果你有活动的单一界面,那么就能在界面里看到一个IP地址(没有其他任何字符)
ip addr show
#终端会返回各个已连接的网络设备的详细信息。

文件上传和下载

  • 压缩和解压文件
压缩文件:tar zcvf  [文件名.tar.gz]  [目标文件夹] 
#例如 tar zcvf QQ.tar.gz  QQ/  可以将当前目录下的QQ文件夹中的文件压缩成  QQ.tar.gz

解压文件:tar zxvf [文件名.tar.gz]

unzip file.zip
  • 文件上传下载命令

#将本地文件上传至服务器
scp username@serverIp:/path/filename ~/local_dir(本地目录)

# 例如:scp  root@47.100.63.15:~/upload/weiyi.tar.gz ~/local_dir 可以将47.100.63.15服务器上root用户中~/upload/weiyi.tar.gz下载至本地~/local_dir目录中

scp /path/filename  username@serverIp:/path

# 例如 :scp weiyi.tar.gz root@47.100.63.15:~/upload  可以将当前路径下的weiyi.tar.gz 上传至服务器47.100.63.15中root用户中~/upload文件夹中。



# 从服务器下载整个目录
scp -r username@servername:/var/www/remote_dir/(远程目录) /var/www/local_dir(本地目录)

例如:scp -r root@192.168.0.101:/var/www/test /var/www/

# 上传目录到服务器
scp -r local_dir username@servername:remote_dir

例如:scp -r test root@192.168.0.101:/var/www/ 把当前目录下的test目录上传到服务器的/var/www/ 目录

scp -r /Users/yuanbo/Downloads/www root@1.13.2.85:/var/ 

scp 覆盖文件使用命令

# 上传目录到服务器上的otree目录中

scp -r /Users/yuanbo/Downloads/Online_experiments/oTree/oTree_Projects/IAS_scale root@1.13.2.85:/root/Online_experiment/oTree/

#复制整个文件夹(使用r switch 并且指定目录)
#cd /Users/yuanbo/Downloads/Online_experiments/oTree/oTree_Projects
#scp -v -r diff root@1.13.2.85:/root/Online_experiment/oTree/

参考sh 命令上传本地文件到Linux服务器https://www.jianshu.com/p/c43105320695

Linux vi编辑器常见命令

http://c.biancheng.net/cpp/html/2735.html

vi 是十年磨一剑的产品,虽然命令繁多,并且大多数功能都是依靠键盘输入来完成,但是一旦你熟悉后,会发现 vi 的功能和效率是其他图形界面编辑器无法比拟的。

Vim 是 Vi improved 的缩写,是 vi 的改进版。在Linux中,vi 被认为是事实上的标准编辑器,因为:

  • 所有版本的 Linux 都带有 vi 编辑器;
  • 占用资源少;
  • 与 ed、ex 等其他编辑器相比,vi 对用户更加友好。

竖线(|)代表光标的位置;波浪号(~)代表该行没有任何内容。如果没有 ~,也看不到任何内容,那说明这一行肯定是有空白字符(空格、tab 缩进、换行符等)或不可见字符。

工作模式

进一步了解 vi 之前先来了解一下 vi 的工作模式,vi 有三种工作模式:

1) 普通模式

由Shell进入vi编辑器时,首先进入普通模式。在普通模式下,从键盘输入任何字符都被当作命令来解释。普通模式下没有任何提示符,输入命令后立即执行,不需要回车,而且输入的字符不会在屏幕上显示出来。

普通模式下可以执行命令、保存文件、移动光标、粘贴复制等。

2) 编辑模式

编辑模式主要用于文本的编辑。该模式下用户输入的任何字符都被作为文件的内容保存起来,并在屏幕上显示出来。

3) 命令模式

命令模式下,用户可以对文件进行一些高级处理。尽管普通模式下的命令可以完成很多功能,但要执行一些如字符串查找、替换、显示行号等操作还是必须要进入命令模式。

注意:有些教程中称有两种工作模式,是把命令模式合并到普通模式。

工作模式切换:

  • 在普通模式下输入 i(插入)、c(修改)、o(另起一行) 命令时进入编辑模式;按 esc 键退回到普通模式。
  • 在普通模式下输入冒号(:)可以进入命令模式。输入完命令按回车,命令执行完后会自动退回普通模式。

提示:如果不确定当前处于哪种模式,按两次 Esc 键将回到普通模式。

退出 vi 编辑器

一般在命令模式下退出 vi 编辑器。

退出命令说明
q如果文件未被修改,会直接退回到Shell;否则提示保存文件。
q!强行退出,不保存修改内容。
wqw 命令保存文件,q 命令退出 vi,合起来就是保存并退出。
ZZ保存并退出,相当于 wq,但是更加方便。

退出之前,你也可以在 w 命令后面指定一个文件名,将文件另存为新文件,例如:

w filename2

将当前文件另存为 filename2。

a. 进入输入模式 新增 (append) a :从光标所在位置後面开始新增资料,光标後的资料随新增资料向後移动。 A:从光标所在列最後面的地方开始新增资料。

插入 (insert) i:从光标所在位置前面开始插入资料,光标後的资料随新增资料向後移动。 I :从光标所在列的第一个非空白字元前面开始插入资料。

开始 (open) o :在光标所在列下新增一列并进入输入模式。 O: 在光标所在列上方新增一列并进入输入模式。 b. 退出vi 在指令模式下键入:q,:q!,:wq或:x(注意:号),就会退出vi。其中:wq和:x是存盘退出,而:q是直接退出,如果文件已有新的变化,vi会提示你保存文件而:q命令也会失效,这时你可以用:w命令保存文件后再用:q 退出,或用:wq或:x命令退出,如果你不想保存改变后的文件,你就需要用:q!命令,这个命令将不保存文件而直接退出vi。

c. 删除与修改文件的命令: x:删除光标所在字符。 dd :删除光标所在的列。 r :修改光标所在字元,r 後接著要修正的字符。 R:进入取替换状态,新增文字会覆盖原先文字,直到按 [ESC] 回到指令模式下为止。 s:删除光标所在字元,并进入输入模式。 S:删除光标所在的列,并进入输入模式。

d. 屏幕翻滚类命令 Ctrl+u: 向文件首翻半屏 Ctrl+d: 向文件尾翻半屏 Ctrl+f: 向文件尾翻一屏 Ctrl+b: 向文件首翻一屏 nz: 将第n行滚至屏幕顶部,不指定n时将当前行滚至屏幕顶部。

e. 删除命令 ndw或ndW: 删除光标处开始及其后的n-1个字 do: 删至行首 d$: 删至行尾 ndd: 删除当前行及其后n-1行 x或X: 删除一个字符,x删除光标后的,而X删除光标前的 Ctrl+u: 删除输入方式下所输入的文本

f. 搜索及替换命令 /pattern: 从光标开始处向文件尾搜索pattern ?pattern: 从光标开始处向文件首搜索pattern n: 在同一方向重复上一次搜索命令 N: 在反方向上重复上一次搜索命令 :s/p1/p2/g: 将当前行中所有p1均用p2替代 :n1,n2s/p1/p2/g: 将第n1至n2行中所有p1均用p2替代 :g/p1/s//p2/g: 将文件中所有p1均用p2替换

g. 复制,黏贴 (1) 选定文本块,使用v进入可视模式;移动光标键选定内容 (2) 复制选定块到缓冲区,用y;复制整行,用yy (3) 剪切选定块到缓冲区,用d;剪切整行用dd (4) 粘贴缓冲区中的内容,用p

用JATOS+lab.js建立你的在线行为实验

购买好云主机后,我们再回到管理控制台的页面,点击 “实例”,这里将会显示我们购买的云主机。下图展示的是我以前购买的一个过期的主机,所以在 “状态” 那一栏显示 “已过期”。需要注意的是,我们在 “IP 地址” 那一栏可以看到两个 IP,其中一个公有一个私有,这是什么意思呢?公有 IP 是指,这个 IP 可以通过外网来进行访问,实验志愿者们访问的也是这个 IP 地址;而私有 IP 则是阿里云内部的 IP,比如主机和主机之间可以通过私有 IP 来通讯,这样速度更快。我们只需要记住自己的公有 IP 即可。「被这句话坑了不少,其实设置服务器上的JATOS还是需要私有IP」

一般刚开通云主机的话,需要等待 3-5 分钟进行初始化,等到 “状态” 那一栏显示为 “运行中” 的时候,我们就可以点击 “远程连接” 来进行操作。

进入登录界面,首先我们需要在 log 那一栏输入账户名 root ,然后在 password 那一栏输入自己设定的密码。当提示 “Welcome to Alibaba Cloud Elastic Compute Service !” 时,说明我们登录成功。

安装 JRE

JRE 是啥?简单来说,JRE 是 JAVA 的运行环境,如果想要在电脑上运行用 Java 编写的程序,则需要先安装 JRE。在 Ubuntu 的环境中安装 JRE 非常容易,只需要在命令行中输入如下代码(分 3 次输入,每次输入一行):

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install default-jre

CentOS使用yum安装jdk - SegmentFault 思否

我的服务器是CentOS 8.2 64位,安装命令如下:

sudo yum install java-11-openjdk-devel
java -version
# 顺便安装git
sudo yum install git

当提示是否安装(y/n)时,输入 y 并按下回车键即可。

安装完毕后,我们在命令行中输入:

java -version

如果显示了 3 行版本信息,那么说明 jre 已经成功安装。如果提示未发现 java,那么说明之前的安装有问题,需要重新来过。

  • java版本:

    • 较新的版本是java11,若要安装执行命令:sudo apt install default-jre
    • 我选择的是java8,因为此版本是得到广泛支持的。安装命令:sudo apt install openjdk-8-jdk
  • 安装好后,执行java -version,如果输出java版本,则说明安装成功

  • 配置环境变量:

    • 通过上述方式安装的java,目录是在:/usr/lib/jvm/java-*-openjdk-amd64

    • 所以环境变量配置时候添加下面内容即可:

      export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
      export JRE_HOME=/usr/lib/jvm/java-8-openjdk-amd64/jre
      

安装 JATOS

安装 JATOS 就非常容易了,只需要下载网络上对应版本的文件解压即可。

  1. Download the latest JATOS release(exchange ‘xxx’ with the current version)
    • Without Java: jatos-xxx.zip
    • For MacOS bundled with Java: jatos-xxx_mac_java.zip
    • For Linux bundled with Java: jatos-xxx_linux_java.zip
  2. Unzip the downloaded file. You can place the unzipped folder pretty much anywhere, except in a folder that synchs across devices, like Dropbox or Google Drive. Find out more about why not.
  3. In your terminal window, cd into the unzipped JATOS folder
  4. Run the loader shell script with the command ./loader.sh start (You might have to change the file’s permissions with the command chmod u+x loader.sh to make it executable). Ignore pop-ups like ‘To use the java command-line tool you need to install a JDK’ - just press ‘OK’.

[Optional] Auto-start JATOS

It’s nice to have JATOS starts automatically after a start or a reboot of your machine. Choose between one of the two possibilities: 1) via a systemd service (JATOS version >= 3.1.6, recommended), or 2) via a init.d script.

Create a systemd service file for JATOS

vim /etc/systemd/system/jatos.service

and put the following text inside.

[Unit]
Description=JATOS
After=network-online.target
# If you use JATOS with an MySQL database use
#After=network-online.target mysql.service

[Service]
PIDFile=/root/Online_experiment/jatos/RUNNING_PID
User=root
ExecStart=/root/Online_experiment/jatos/loader.sh start
ExecStop=/bin/kill $MAINPID
ExecStopPost=/bin/rm -f /root/Online_experiment/jatos/RUNNING_PID
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target

Change the paths and the user according to your JATOS path and the user you want to start JATOS with.

Secondly, notify systemd of the new service file:

systemctl daemon-reload
#and enable it, so it runs on boot:
systemctl enable jatos.service

ATOS with MySQL

不少必须要安装MySQL,JATOS本身内嵌有数据库。


CentOS安装node.js环境

https://cloud.tencent.com/developer/article/1626800

Node.js 是一个跨平台的 JavaScript 运行环境,它构建在为了在服务器端运行 JavaScript 代码而设计的 Chrome JavaScript 上。使用 Node.js,你可以构建扩展的网络应用。

npm,是 Node Package Manager 的简称,它是 Node.js 为了方便开发者使用和重用代码而开发的默认包管理器。它也是世界上用来发布开源 Node.js 包的最大软件仓库。

在这篇文章中,我们将会带你一起看看在 CentOS 8 上安装 Node.js 和 npm 的两种不同方式。根据你的环境,选择最适合你的方式。

#Node.js 和 npm 可以通过标准的 CentOS 源仓库进行安装。在写这篇文章的时候,在仓库中的 Node.js 版本是 v10.x。 通过运行以下命令来列出nodejs包:
yum module list nodejs

#nodejs 包提供了不同的剖面,默认的剖面,被使用[d]进行标记将会安装通用的运行包。想要在你的 CentOS 系统上安装默认的 Node.js 包,输入:
sudo yum module install nodejs
#上面的命令同样也会安装 NPM。

# 卸载 Node.js
sudo yum module remove nodejs


## 下载installer.js
wget https://nodegame.org/nodegame-installer.js

安装nodeGame

https://nodegame.org/install.htm

node launcher.js

#Open your browser at localhost:8080, and select the Ultimatum game
#Open more tabs, click "Play with Bots", or manually launch a bot connecting to: localhost:8080/ultimatum/?clientType=autoplay
#Check the monitor interface: localhost:8080/ultimatum/monitor
Yuan Bo 袁博
Yuan Bo 袁博
Associate Professor of Psychology (Social Psychology)

My research examines the nature and dynamics of social norms, namely how norms may emerge and become stable, why norms may suddenly change, how is it possible that inefficient or unpopular norms survive, and what motivates people to obey norms. I combines laboratory and simulation experiments to test theoretical predictions and build empirically-grounded models of social norms and their dynamics.

comments powered by Disqus