Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

增加任务状态的建议 #65

Open
GZMaike opened this issue Mar 8, 2023 · 1 comment
Open

增加任务状态的建议 #65

GZMaike opened this issue Mar 8, 2023 · 1 comment

Comments

@GZMaike
Copy link

GZMaike commented Mar 8, 2023

exec和scp的执行过程中,可能需要增加一些控制点:

  • 中断:执行过程可以中断,特别是长时间执行exec或上传下载时
  • scp传输完成率:需要有传输总字节数和已完成传输的字节数,方便计算出完成百分比
  • 异步:接口调用和结果需要分开,避免长时间的阻塞

建议用mpsc::channel()搭建跨线程的共享缓存,利用缓存记录任务状态,实现以上控制点功能。

@HsuJv
Copy link
Collaborator

HsuJv commented Mar 9, 2023

感谢您的提议。

关于您提议的三点,

  1. 中断:在run_local模式下,所有操作都需要同步完成,所以无论是scp还是exec都无法增加这个api,但是在run_backend模式下,或许可以增加类似的api。对于SSH来说,用户每开启一个channel,在服务器端都是并发执行的,所以如果只是为了多任务执行,可以使用run_backend模式同时打开多个channel,如果是为了阻止先前命令产生的副作用,那还是需要一个cancel或者abort的api,之前设计的时候没有考虑到。
  2. scp传输完成率:基于当前的设计,local模式或许可以在log里面增加相关打印,但是依然是前述问题,因为同步执行,无法提供单独api。backend模式目前的处理是先把文件全部读入内存然后提交到后台线程进行传输,所以可以提供所需api,会在后续更新中留意。
  3. 异步:如果只是单纯的指异步地执行ssh的相关操作,那么run_backend模式已经有了相关实现,保留同步执行的目的是为了兼容单线程执行环境(WASI,虽然目前对WASI的适配还在进行中)。如果是指async关键词的异步代码,这个改动或许有些巨大,需要把所有使用where S: Read + Write签名的方法全部重写,目前好像还没有一个好的方案能用同一套底层代码同时支持同步和异步io,关于这个改动是否要进行还在考虑中,或许会新开一个库来实现,因为并不是所有场景都适合引入异步进行时。

如果还有更多建议与问题,烦请告知

BRs.

P.S. 关于并发执行的POC,您可以尝试

use ssh_rs::ssh;

fn main() {
    ssh::enable_log();

    let mut session = ssh::create_session()
        .username("ubuntu")
        .password("password")
        .private_key_path("./id_rsa")
        .connect("127.0.0.1:22")
        .unwrap()
        .run_backend();
    let exec = session.open_exec().unwrap();
    let exec2 = session.open_exec().unwrap();

    const CMD: &str = "sleep 10 && date";

    // send the command to server
    println!("Send command {}", CMD);
    exec.send_command(CMD).unwrap();
    exec2.send_command(CMD).unwrap();

    // process other data
    println!("Do someother thing");

    // get command result
    let vec: Vec<u8> = exec.get_result().unwrap();
    println!("{}", String::from_utf8(vec).unwrap());
    let vec2: Vec<u8> = exec2.get_result().unwrap();
    println!("{}", String::from_utf8(vec2).unwrap());


    // Close session.
    session.close();
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants