【问题标题】:Bash script, killing a program (vim and atom->editor) within the running scriptBash 脚本,杀死正在运行的脚本中的程序(vim 和 atom->editor)
【发布时间】:2018-03-17 19:39:55
【问题描述】:

有什么方法可以从正在运行的脚本中杀死/退出/关闭 VI 和 ATOM 示例脚本,test.sh:

EDITOR1=vi EDITOR2=原子

$EDITOR1 helloWorld.txt $EDITOR2 file1.txt

杀死$EDITOR1 杀死$EITOR2

是否有任何 NOT Set 方法来杀死它,我的意思是使用变量,例如文件名。

【问题讨论】:

  • 请让您的代码更清晰,我无法完全理解您的目标。

标签: bash shell kill


【解决方案1】:

可以使用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 ~]$ 

【讨论】:

    【解决方案2】:

    我可以想到两种方法:

    按名称杀死进程。

    kill `pidof $EDITOR1`
    

    杀死最后启动的进程

    vi file &
    kill $!
    

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

    【讨论】:

    • 好像不行
    【解决方案3】:

    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
    

    我还没有尝试过,但它会起作用

    【讨论】:

    • 我不知道我是否做错了什么,但这些似乎都不起作用
    • ./killEd.sh:第 11 行:kill:(1) - 不允许操作 ./killEd.sh:第 12 行:kill:(2) - 不允许操作:~/Documents/coding /ios) Vim: 警告: 输入不是来自终端 Vim: 读取输入时出错,正在退出... Vim: 完成。
    • 这就是我得到的,而且 atom 没有 vi 关闭
    • 对不起,在 kill 之后追加 % 。像这样kill %{then the variable name}。 vim 需要一个交互式终端才能工作,因此您不能将其放置为后台作业
    【解决方案4】:

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

    killall vim
    killall atom
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-24
      • 2019-03-21
      • 1970-01-01
      • 1970-01-01
      • 2017-03-31
      • 2010-12-23
      • 2016-10-08
      • 2012-06-14
      相关资源
      最近更新 更多