1. 程式人生 > >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指令碼是單程序模型。

轉載註明出處。