繁体   English   中英

命令`cargo run`导致“没有这样的文件或目录”

[英]Command `cargo run` leads to "No such file or directory"

我需要运行以sudo特权运行单独进程的测试(因为它们需要运行特权指令,例如shmat )。

我使用.cargo/config运行测试sudo ,这就是导致错误的原因,删除它允许测试工作,直到它尝试shmat时它失败。

在一个最小的可重现示例中,错误是:

thread 'tests::base' panicked at 'called `Result::unwrap()` on an `Err` value: Os { code: 2, kind: NotFound, message: "No such file or directory" }', src/lib.rs:4:103
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

项目布局如下:

.
├── .cargo/
│   └── config.toml
├── Cargo.lock
├── Cargo.toml
└── src/
    ├── lib.rs
    └── bin/
        └── new_process.rs

config.toml

[target.x86_64-unknown-linux-gnu]
runner = 'sudo -E'

cargo.toml

[package]
name = "mre"
version = "0.1.0"
[dependencies]
libc = "0.2.127"

lib.rs

#[cfg(test)]
mod tests {
    #[test]
    fn base() {
        let output = std::process::Command::new("cargo").args(["run","--bin","new_process"]).output().unwrap();
        dbg!(output);
    }
}

new_process.rs

fn main() {
    let shmid = libc::shmget(libc::IPC_PRIVATE, 1024*4, libc::IPC_CREAT);
    let shared_mem_ptr = libc::shmat(shmid, std::ptr::null(), 0);
    println!("hello world");
}

如果您通过rustup安装 cargo,它可能会安装在您的主目录中,而不是像/usr/bin/那样全局安装。

在我的机器上:

$ which cargo
/home/linus/.cargo/bin/cargo

所以在sudo下,没有找到cargo:

$ sudo cargo
sudo: cargo: command not found

这与unwrapCommand::new().output()的结果完全相同。 所以不是 rust 问题; 这是 linux 问题。

  1. 您可以指定 cargo 可执行文件的绝对路径:
// in lib.rs base()

// Modify for the location of cargo on your machine
Command::new("/home/linus/.cargo/bin/cargo")
  1. 或者您可以创建一个从/usr/bin/cargo//home/linus/.cargo/bin/cargo的符号链接:
sudo ln -s /home/linus/.cargo/bin/cargo /usr/bin/cargo

然后,货物也可以使用 sudo 找到。

  1. 或者您可以使用独立安装程序全局安装 cargo。 https://stackoverflow.com/a/65255288/14350146

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM