Useful Commands

7 minute read

Published:

Linux

Miscellaneous

# change mode
chmod +x filename    
# check history
history             
history | grep configure
# kill a progress
killall progress_name  
# output message to file
echo 'hello' > log
# combine figures in to a gif
convert -delay 10 -loop 0 input_*.png output.gif
# install packages
sudo dpkg -i XXX.deb

Slurm

# Check Partition
whichpartition
# Set MPI Environment on Hefei-HPC
module unload mpi/intelmpi/2018.4.274
module load   mpi/openmpi/2.1.2/gcc-7.3.1

Git

Setting

ssh-keygen -t rsa -C “your_Github_email@adrress”
cd ~/.ssh
vim id_rsa.pub
# and then copy the key into: Github website --> add Key
# check git ssh status 
ssh -T git@github.com  
# config     
git config --global user.name “your Github name”
git config --global user.email “your_Github_email@adrress”

Commit

git init
git add .
git commit -m ‘first commit’
git remote add origin https://github.com/your_Github_name/reop_name.git
git push -u origin master
# after the first commit 
git add . 
git commit -m  'second commit'
git push
# check the origin repository address
git remote -v 
# if you want to remove the current repository address 
git remote rm origin  	

SSH

# log into remote server using SSH
ssh -X your_user_name@IP_address    # -X: enable graphic function
# download files from server using SSH
scp your_user_name@IP_address: /file/path/on/server /file/path/on/local/computer
# upload files to server using SSH
scp /file/path/on/local/computer your_user_name@IP_address:/file/path/on/server   
# copy local ssh key to server
ssh-copy-id your_user_name@IP_address

SSHFS

Mount a remote filesystem using SFTP.

# install
sudo apt install sshfs
# mount a remote filesystem, local folder must be empty
sshfs -o follow_symlinks your_user_name@IP_address:/path/on/server /path/on/local/computer
# unmount a remote filesystem
fusermount -u /path/on/local/computer

Screen

Perform a long-running task on remote serve even if your SSH get disconnected.

# Linux screen 
sudo apt install screen
# start a session 
screen
# start a named session
screen -S session_name
# list all sessions 
screen -ls    
# enter session: id
screen -r id
# detach from the screen session 
Ctrl+a d

Filewall Setup

sudo ufw status verbose
sudo ufw allow ssh
sudo ufw allow from 222.XXX.XX.XXX
sudo ufw allow from 222.XXX.XX.XXX to any port 22
sudo ufw status numbered 
sudo ufw delete
sudo ufw default allow outgoing
sudo ufw default deny outgoing

Change Permissions

To change directory permissions in Linux, use the following:
chmod +rwx filename to add permissions
chmod -rwx directoryname to remove permissions
chmod +x filename to allow executable permissions
chmod -wx filename to take out write and executable permissions

Add Users

sudo adduser username
sudo mkdir /data/username
sudo chown -R username:username folder

Python

Python Profiling

Profile CPU time

pip install snakeviz
python -m cProfile -o temp.dat <PROGRAM>.py
snakeviz temp.dat

Profile memory

import numpy as np
from memory_profiler import profile
# put a decorator here
@profile(precision=4, stream=open("memory_profiler.log","w"))
def my_fun():   
    a = np.ones(1000)
    b = np.ones(1000)
	c = np.sum(a + b)
	print(c)

if __name__ == '__main__':
    my_fun()

Install

python setup.py instal

MATLAB

Install

sudo mount -o loop R2021a_Linux.iso /mnt
cd /mnt
sudo ./install
umount /mnt/
# License file can be found on the USTC website

Useful Commands

% Save ascii file
a = 1
filename = sprintf(data_%d.dat', a);
save(filename,'variable','-ascii');

% Save files with different names
for i = 1 : 10
		k = i * ones(10,10);
		filename = strcat('File', num2str(i));
		save( [filename, '.dat'],  'k', '-ascii');
end

% Read binary file
M = 101;
N = 201;
fid = fopen('file.bin', 'rb');
[data, count] = fread(fid, [M,N],'float');
fclose(fid);

% Add path
path = '/home/haipeng/MyCode/'
addpath(genpath(path),'-begin');

% Read data in a quick manner
data = dlmread(filename);

% Set two-line title 
title({'You can do it','with a cell array'})

C & Fortran

C call Fortran

# Step1:  Write the Fortran code
# Step2:  Write the C code 
#
# Suppose in the Fortran code, there is a function: 
#      myadd( n, a, b, c) 
# which performs c[n] = a[n] + b[n]
#
# In the c code, we need to call: 
#      __modulename_MOD_myadd( &n, &a, &b, &c);
#
# Also Use *nm fortran_module_name.o* to confirm the name.
#
# Step 3: Compile

gfortran -c Fortran_code.f90
gcc      -c C_code.c
gcc      -o c_call_fortran C_code.o Fortran_code.o -lgfortran  #lgfortran 调用库函数
./c_call_fortran

Fortran call C

# Fortran main program named as f-call-c.f, in free format.

program f_call_c
integer :: i=1, ierr
double precision :: x=3.14159
print *, "Fortran calling C, passing"
print *, "i=",i,"x=",x
ierr = cfun(i,x)
end program f_call_c

# C function (cfun.c): note the trailing underscore in the function name cfun_

#include <stdio.h>
int cfun_(int *ip, double *xp)
{
int i = *ip;
double x = *xp;
printf("This is in C function...\n");
printf("i = %d, x = %g\n", i, x);
return 0;
}

# Compile: using Intel compilers icc and ifort
ifort -free -c f-call-c.f
icc -c cfun.c
ifort -o f-call-c-icc f-call-c.o cfun.o
./f-call-c-icc

#Compile: using gcc and gfortran
gfortran -ffree-form -c f-call-c.f
gcc -c cfun.c
gfortran -o f-call-c-gcc f-call-c.o cfun.o
./f-call-c-gcc

Useful Fortran Commands

# Compile many subroutines in Fortran
# Option 1: 
use include ‘subroutine_name.f90’

# Option 2:
compile all subroutine to generate all *.o files 
gfortran *.o file -o out.o

# Fortran debug
gfortran -g -fcheck=all -Wall example.f90

# Something danger in Fortran
Fortran can not use 6 as file pointer

OpenMP

Complie

gcc -fopenmp
icpc -openmp

GMT

  • https://blog.seisman.info/global-relief-models/ 有介绍如何下载地形数据
  • 如果要使用高精度的地形数据,一般在http://srtm.csi.cgiar.org/srtmdata/ 下载(需要能连上Google),但是对于比较大的区域,需要将多个地形数据合并在一起才能使用。首先要安装工具包gdal(Ubuntu 16.04 LTS)
sudo add-apt-repository -y ppa:ubuntugis/ubuntugis-unstable
sudo apt update 
sudo apt install gdal-bin python-gdal python3-gdal
# (https://github.com/adamrehn/mergetiff)
  • 安装成功后使用以下命令把多个地形数据合并成一个 gdal_merge.py -init 255 -o out.tif srtm_56_07.tif srtm_57_07.tif
  • 使用以下的命令将 .tif文件转化为能用于GMT画图的 .grd文件 gdal_translate -of GMT out.tif srtmc_out.grd
  • 在画断层或者其他构造线时,拿到的数据往往都是 .kml或者 . kmz格式的文件,这些格式的文件可以用Google Earth或者其他地图软件打开,但不能在GMT中使用,使用下面的命令转化为GMT可以使用的格式 gmt kml2gmt CN-Faults.kml -V > CN-Faults.dat 对于. kmz格式文件,可以先使用Google Earth或其他地图软件转为 .kml的文件,再使用以上命令。
  • 如果grd文件的网格太大,可以用下面的命令来插值,获取更小网格的grd文件,-I1s表示1秒,也可以用-I1m,代表1度。 gmt grdsample Suqian.grd -I1s -GSuqian_new_0.1.grd
  • 可以使用如下命令,cut一部分grd文件 gmt grdcut $topoFile -R范围 -GSuqian_0.5.grd
  • 画不规则的图,目前想到的方法是生成该地区的grd文件,再生成对应的bln文件,在Surfer里面用assign no data功能把不想要的地方切除,注意如果网格太大,切除的效果不好,要注意grd网格和bln的尺度要相匹配,否则会有矩形边齿。

Linux Installation

Common Kits

sudo apt-get install build-essential   # including: libc6, libc, gcc, g++, make, dpkg
sudo apt install gfortran 
sudo apt install vim
sudo apt install git

OpenMPI

# Download the latest OpenMPI package, 
# or download the specific version from: http://www.open-mpi.org/software/ompi
wget https://download.open-mpi.org/release/open-mpi/v4.1/openmpi-4.1.1.tar.gz 
tar xvfz openmpi-4.1.1.tar.gz
cd openmpi-4.1.1
# Configure & install OpenMPI (this would take quite a while)
./configure --prefix=/usr/local/openmpi CC=gcc FC=gfortran
make
sudo make install
# Add env path at your ~/.bashrc
echo export PATH=/usr/local/openmpi/bin:$PATH >> ~/.bashrc
source ~/.bashrc
# Check
which mpirun

Anaconda

# Install
bash Anaconda3-2019.10-Linux-x86_64.sh
enter: yes  
source ~/.bashrc

# Creat new environment
conda install -c anaconda anaconda-navigator 
anaconda-navigator
conda create --name my_env python=3.7    (install the GUI)
conda install -c conda-forge obspy
conda activate my_env

# Uninstall
conda install anaconda-clean
anaconda-clean

Cuda

# Also refer to: https://blog.nickwhyy.top/cuda/

wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/cuda-ubuntu1604.pin
sudo mv cuda-ubuntu1604.pin /etc/apt/preferences.d/cuda-repository-pin-600
wget http://developer.download.nvidia.com/compute/cuda/10.1/Prod/local_installers/cuda-repo-ubuntu1604-10-1-local-10.1.243-418.87.00_1.0-1_amd64.deb
sudo dpkg -i cuda-repo-ubuntu1604-10-1-local-10.1.243-418.87.00_1.0-1_amd64.deb
sudo apt-key add /var/cuda-repo-10-1-local-10.1.243-418.87.00/7fa2af80.pub
sudo apt-get update
sudo apt-get -y install cuda

SPECFEM2D/3D

MPI Version

# 配置好gcc,gfortran和openmpi后可以安装specfem2D/3D
# 注意:openmpi编译的时候使用的CC和FC必须和安装时使用的一样
# 安装必要的包:
sudo apt-get install zlib1g-dev

# 配置, 最好给出MPIFC和MPI_INC的绝对路径
/configure FC=gfortran CC=gcc MPIFC=/usr/local/openmpi/bin/mpif90 MPI_INC=/usr/local/openmpi/include --with-mpi   
make 

GPU Version

./configure --with-cuda=cuda9 CUDA_LIB=/usr/local/cuda/lib64 CUDA_INC=/usr/local/cuda/include MPI_INC=/opt/mpich3.3/include --with-mpi
make

# 这里不知道CUDA_FLAGS 填什么,省略CUDA_FLAGS也可以make成功, 我是cuda10.1, 但是makefile里面最高有cuda9.0, 这里用cuda=cuda9也可以make成功