Bash 脚本,在 运行 脚本中杀死一个程序(vim 和 atom->editor)
Bash script, killing a program (vim and atom->editor) within the running script
有什么方法可以从 运行 脚本中 KILL/EXIT/CLOSE VI 和 ATOM
示例脚本,test.sh:
EDITOR1=vi
EDITOR2=原子
$EDITOR1 helloWorld.txt
$EDITOR2 file1.txt
杀死$EDITOR1
杀死 $EITOR2
是否有任何 NOT Set 方法来杀死它,我的意思是使用变量,例如文件名。
我可以想到两个办法:
通过名称终止进程。
kill `pidof $EDITOR1`
杀死最后启动的进程
vi file &
kill $!
&: 在后台启动进程(用于交互式命令行会话)
$!: 保存上次执行进程的 pid。
kill 不适用于任何 EDITOR
变量,因为其中 none 是作业 ID,kill 仅适用于作业 ID 或进程 ID。 运行 您上面的脚本不会在后台放置任何命令,一旦 EDITOR1
执行它会阻止整个程序,在该进程(由 [=14= 创建)之前什么都不能 运行 ] 被杀死。为了实现你想要的目标,你必须使用 &
在后台 运行 它们,当你使用 &
时,将创建一个 JOB ID(递增)调用 &
,您必须找到一种方法来跟踪 JOB IDS。例如,如果您执行 $EDITOR1 filename.txt &
;如果您执行 $EDITOR2 filename2.txt
,则会创建一个工作 ID 1已创建作业 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
我还没有尝试过这些,但它会起作用
可以使用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 ~]$
为什么不用killall
命令,例如:
killall vim
killall atom
有什么方法可以从 运行 脚本中 KILL/EXIT/CLOSE VI 和 ATOM 示例脚本,test.sh:
EDITOR1=vi EDITOR2=原子
$EDITOR1 helloWorld.txt $EDITOR2 file1.txt
杀死$EDITOR1 杀死 $EITOR2
是否有任何 NOT Set 方法来杀死它,我的意思是使用变量,例如文件名。
我可以想到两个办法:
通过名称终止进程。
kill `pidof $EDITOR1`
杀死最后启动的进程
vi file &
kill $!
&: 在后台启动进程(用于交互式命令行会话)
$!: 保存上次执行进程的 pid。
kill 不适用于任何 EDITOR
变量,因为其中 none 是作业 ID,kill 仅适用于作业 ID 或进程 ID。 运行 您上面的脚本不会在后台放置任何命令,一旦 EDITOR1
执行它会阻止整个程序,在该进程(由 [=14= 创建)之前什么都不能 运行 ] 被杀死。为了实现你想要的目标,你必须使用 &
在后台 运行 它们,当你使用 &
时,将创建一个 JOB ID(递增)调用 &
,您必须找到一种方法来跟踪 JOB IDS。例如,如果您执行 $EDITOR1 filename.txt &
;如果您执行 $EDITOR2 filename2.txt
,则会创建一个工作 ID 1已创建作业 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
我还没有尝试过这些,但它会起作用
可以使用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 ~]$
为什么不用killall
命令,例如:
killall vim
killall atom