首页 > 代码库 > linux下通过命令启动多个终端运行对应的命令和程序

linux下通过命令启动多个终端运行对应的命令和程序

    作者:张昌昌

     在一些情况下,往往须要同一时候启动多个终端并让终端运行自己主动运行对应的命令,进而达到提高操作效率的目的。在linux下gnome-terminal启动终端命令,

gnome-terminal -x 后跟运行的命令,bash是linux启动子shell的命令,bash -c "所要运行的命令串",通过嵌套gnome-terminal -x bash -c ......,表示启动新终端,

并在新启动的终端里运行bash -c,即启动子shell,由子shell运行-c后面的双引號括起来的命令串。同一时候为保证gnome-terminal新启的终端不退出,要在bash -c的命令串后

加bash让其有一个进程在执行,本例中加的是erl命令,直接进入erl终端,当然不会退出。

c语言版:

 #include <unistd.h> 
#include <sys/types.h> 
#include <stdio.h> 
#include <stdlib.h> 
int main(int argc,char * argv[]) 
{ 
int count = atoi(argv[1]),i; 
for(i=0;i<count;i++) 
{ 
pid_t pid = fork(); 
if(pid == 0) 
{ 
//printf("child=%d ",getpid()); 
system("gnome-terminal -x bash -c ‘ulimit -n 1000000;cd /home;erl‘"); 
exit(0); 
} 
} 
exit(0); 
}   

运行 ./a.out 3
该程序採用异步多进程方式,fork子进程,通过system(。。。。)系统调用运行对应的命令,该程序须要注意的是(1)main函数怎样带參数,所带的參数是从argv[1]開始的,argv[0]默认的參数为“0”,实际上argv数组的长度是外面參数的个数加1;(2)fork出的子进程,照样会运行for循环,因此为避免此现象发生,fork子进程运行后,exit(0)让子进程退出,启动下一个子进程;(3)fork返回值在子进程里是0,在父进程里是生成的子进程进程号;(4)c语言的atoi()能够把字符串转化为整型。

Bash shell版

#!/bin/bash
for((i=0;i<$1;i++))
do
((port=2+i))
gnome-terminal -x bash -c "cd /home;ulimit -n 1000000;erl +K true -run io format $port" &
done

该脚本更加轻量灵活,注意&是切换到后台执行,防止堵塞当前进程的for的下一次执行,由此可知shell也是多进程模型,而js脚本是单进程模型。

转载注明出处。

linux下通过命令启动多个终端运行对应的命令和程序