spawn....expect简介及遇到的坑

为什么使用spawn expect …

很多时候,指令的执行是需要交互的,比如下面这个命令大家一定很熟悉:

ssh-keygen -t rsa
# 以及
ssh-copy-id -i /home/xxx/.ssh/id_rsa.pub $username@$host_name

这里需要按三次回车键,或输入yes/no,以及密码才可以.当然,还是那句话单点操作随意,如果一项工作重复次数超过2次,那么我们就应该用脚本来管理它,比如我们要在一个集群规模的每个节点都进行上面的操作,那真的是会很累很累…

expect

expect是一款免费的工具,可以实现自动的交互式任务,无需人工干预.
它可以根据程序的提示信息,来模拟标准输入,提供给程序,以此来实现自动化交互执行的目的.

yum provides expect
# 或直接安装
yum install -y expect

expect命令

命令作用
spawn启动一个新的进程,用来执行后面所接的COMMAND
expect期待从进程中获取的内容
send向进程发送内容
set timeout n设置超时时间,单位:,超过n秒则不再继续等待进程的内容返回
interact是否保留交互状态

命令演示

expect脚本文件的头信息与bash不同,这里需要注意
在这里强烈建议大家养成脚本注释的习惯,日后真的非常有用.

#!/usr/bin/expect
#    Program:
#        run the basic test of expect
#    2020/01/19    Shuu    First release
spawn ssh test
expect "yes/no"
send "yes\r"
expect "password*"
send "test\r"
expect eof

上面的例子,我创建了一个test用户,密码也是test,来进行测试.
执行之后虽然命令提示符会显示test@xxxxxx
在这里插入图片描述
但是执行whoami命令后,会发生改变,而且执行结果并不是test用户.
那么如果想继续留在test用户下进行操作该怎么办呢?interact的作用来了

#!/usr/bin/expect
#    Program:
#        run the basic test of expect
#    2020/01/19    Shuu    First release
spawn ssh test
expect "yes/no"
send "yes\r"
expect "password*"
send "test\r"
interact

仅修改最后一行的expect eof为interact即可.将.ssh目录删掉,再次运行

rm -rf ~/.ssh

在这里插入图片描述
上面的内容还可以用另一种方式来书写:
Pattern—— Action:模式和动作,模式可以有多种,每匹配到一种模式进行相应的动作.

#!/usr/bin/expect
#    Program:
#        run the basic test of expect
#    2020/01/19    Shuu    First release
spawn ssh test
expect {
    "yes/no" {send "yes\r";exp_continue}
    "password*" {send "test\r"}
}
expect eof
# or
# interact

exp_continue,表示继续进行余下的模式匹配,除最后一个一般都要加,否则没必要写那么多Pattern不是吗.

在shell脚本中使用expect

由于expect与bash不同,(从表头就能看出),所以在shell脚本中是不能直接使用spawn ... expect的.
具体写法如下:

#!/bin/bash
#        Program:
#            details
#    yyyy/MM/dd Author release
/usr/bin/expect <<EOF
    spawn ssh-copy-id -i /home/hadoop/.ssh/id_rsa.pub $username@$host_name
    expect {
        "yes/no" {send "yes\r";exp_continue}
        "password" {send "$password\r"}
    }
    expect eof
EOF

这里的/usr/bin/expect会进入expect命令行交互模式
在这里插入图片描述
而后面的 <<EOF表示知道接收到EOF字符为止,一直接收输入内容,当接收到EOF字符时,结束本次expect操作.
!!!这里是个坑重要的事情说三遍:
EOF前后一定不能有空格
EOF前后一定不能有空格
EOF前后一定不能有空格
所以,对代码缩进格式有着强迫症的同学要注意啦!!!
最后一行那个EOF一定要在起始位置,不能有空格!!!

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: torch.multiprocessing.spawn.processraisedexception是PyTorch中的一个函数,用于在多进程环境中处理异常。如果在多进程中发生异常,该函数会将异常信息打印出来,并且终止所有进程的运行。 ### 回答2: torch.multiprocessing.spawn.processraisedexception是PyTorch中的一个函数,用于处理多进程的异常。多进程是在一个主进程的基础上创建的,每个子进程都有自己的代码和资源,可以同时运行在不同的CPU核心上,从而提高程序的执行效率。然而,多进程也会面临各种各样的问题,其中一个常见的问题是进程抛出异常。 当一个进程抛出异常时,其他正在运行的进程可能会继续运行,但是主进程需要将异常信息捕获并进行处理。这时就需要用到processraisedexception函数。这个函数可以捕获所有处于活动状态的进程抛出的异常,并将异常信息打印到控制台。 使用processraisedexception需要注意以下几点: 1. 函数的第一个参数是一个函数,这个函数可以是任意的Python函数或方法,它将作为每个子进程的入口点,进程会在这个函数中执行代码。 2. 函数的第二个参数是一个元组,用于向子进程传递参数,参数的数量可以是任意的。 3. 函数的第三个参数是一个字典,用于设置子进程的环境变量。 4. 函数的返回值是一个元组,包括已完成进程的数量和所有进程的返回值。如果有进程抛出异常,则返回的元组中的值是None。 总之,processraisedexception是PyTorch中用于处理多进程异常的重要函数,可以帮助解决多进程程序中的各种问题,提高程序的稳定性和可读性。 ### 回答3: torch.multiprocessing.spawn.processraisedexception是PyTorch中一个函数,用于在多进程中捕获异常并处理。多进程在处理大量数据时通常比单进程更有效,可以提高计算速度。但是,在多进程中出现异常时可能会使整个程序崩溃或发生未知错误。因此,需要一个可以处理异常的机制来保证程序的运行稳定性。 在PyTorch中,torch.multiprocessing.spawn.processraisedexception可以有效地解决这个问题。该函数用于在多进程中创建一个进程并捕获异常,以避免程序的崩溃。当某个进程出现异常时,该函数会抛出一个ProcessExitedWithCode异常,从而让其他进程可以继续执行,避免了整个程序崩溃的情况出现。 此外,torch.multiprocessing.spawn.processraisedexception还可以传递参数,支持自定义进程数、分布式策略以及一些通信参数等。这使得在多进程中运行训练、测试等任务变得更加方便和可控。 总之,torch.multiprocessing.spawn.processraisedexception是PyTorch中非常重要的一个函数,有助于保障多进程程序的稳定性和可靠性,同时也为用户提供了更加便捷的多进程编程接口。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值