Bash脚本,在运行的脚本中查杀程序(vim和atom->编辑器)

时间:2018-03-17 19:39:56

标签: bash shell kill

有没有办法从正在运行的脚本中杀死/退出/关闭VI和ATOM 示例脚本test.sh:

EDITOR1 =六 EDITOR2 =原子

$ EDITOR1 helloWorld.txt $ EDITOR2 file1.txt

杀掉$ EDITOR1 杀死$ EITOR2

是否有任何NOT Set杀死它的方法,我的意思是变量前面的例子是Filename。

4 个答案:

答案 0 :(得分:0)

我可以想到两种方式:

按名称杀死进程。

kill `pidof $EDITOR1`

终止上次启动的流程

vi file &
kill $!

&amp ;:在后台启动进程(用于交互式命令行会话)
$!:保存最后执行进程的pid。

答案 1 :(得分:0)

kill不会对任何EDITOR变量起作用,因为它们都不是作业ID,kill只适用于作业ID或进程ID。运行上面的脚本不会将任何命令放在后台,一旦EDITOR1执行它就会阻塞整个程序,在$EDITOR1 filename创建的进程被杀死之前什么也都无法运行。您需要使用&在后​​台运行它们所需的目标,当您使用&时,每次调用&时都会创建一个JOB ID(增量),您必须找到跟踪JOB IDS的方法。例如,如果您执行$EDITOR1 filename.txt &;创建了作业ID为1,如果执行$EDITOR2 filename2.txt,则创建作业ID为2。您的案例

EDITOR1=vi ; EDITOR2=atom

declare -a JOB_ID
declare -i JOB=0;

$EDITOR1 helloword.txt &;
JOB_ID+=( $(( ++JOB )) );
$EDITOR2 file1.txt;
JOB_ID+=( $(( ++JOB )) );

kill ${JOB_ID[0]}; // kills the first job
kill ${JOB_ID[1]}; // kills the second job

或者您可以使用关联数组

EDITOR1=vi ; EDITOR2=atom

declare -A JOB_ID
declare -I JOB=0;

$EDITOR1 helloword.txt &
JOB_ID[$EDITOR1]=$(( ++JOB ));

$EDITOR2 file1.txt &
JOB_ID[$EDITOR2]=$(( ++JOB ));

kill ${JOB_ID[$EDITOR1]}; // kills the first job
kill ${JOB_ID[$EDITOR2]}; // kills the second job

我没有尝试过这个,但它会开始工作

答案 2 :(得分:0)

您可以使用pkill -f <filename>,如下所示:

[fsilveir@fsilveir ~]$ ps -ef | grep vim
fsilveir 28867 28384  0 00:07 pts/5    00:00:00 vim foo.txt
fsilveir 28870 28456  0 00:07 pts/6    00:00:00 vim bar.txt
[fsilveir@fsilveir ~]$ 
[fsilveir@fsilveir ~]$ pkill -f bar.txt
[fsilveir@fsilveir ~]$ 
[fsilveir@fsilveir ~]$ ps -ef | grep vim
fsilveir 22344 11182  0 Mar18 pts/0    00:00:00 vim openfiles.py
fsilveir 28867 28384  0 00:07 pts/5    00:00:00 vim foo.txt
fsilveir 28958 28740  0 00:08 pts/7    00:00:00 grep --color=auto vim
[fsilveir@fsilveir ~]$ 

答案 3 :(得分:0)

为什么不使用killall命令,例如:

killall vim
killall atom