如何解决Rocket App在等待futex时挂在linux上
我有一个简单的火箭0.5.0-dev应用
main.rs
#[macro_use] extern crate rocket;
use rocket::http::{Status};
use rocket::State;
use std::sync::{Mutex,Arc};
struct Event {}
#[get("/health")]
fn health() -> Result<&'static str,Status> {
Ok("UP")
}
#[launch]
fn rocket() -> rocket::Rocket {
rocket::ignite()
.manage(Arc::new(Mutex::new(Vec::<Event>::new())))
.mount("/",routes![health])
}
Cargo.toml
[package]
name = "minimal-example"
version = "0.1.0"
authors = ["Author <author@example.com>"]
edition = "2018"
[dependencies]
rocket = { git = "https://github.com/SergioBenitez/Rocket" }
rocket_contrib = { git = "https://github.com/SergioBenitez/Rocket" }
chrono = { version = "0.4.19",features = ["serde"] }
serde = { version = "1.0.117",features = ["derive"] }
serde_json = "1.0.59"
rand = "0.7.3"
在我的开发机器上(cygwin中的Rustc 1.47.0(18bf6b4f0 2020-10-07)),我可以编译运行该程序,而x86_64-pc-windows-gnu目标没有问题。
我的CI为x86_64-unknown-linux-musl构建了该程序,并将其打包到一个容器中。
Dockerfile
FROM docker-registry.default.svc:5000/build/rhel:8
USER 0
COPY . /build
RUN microdnf -y install gcc \
&& curl https://sh.rustup.rs -sSf | bash -s -- -y \
&& source $HOME/.cargo/env \
&& rustup target add x86_64-unknown-linux-musl \
&& cd /build \
&& cargo build --release --target x86_64-unknown-linux-musl
RUN ls -lh /build/target/release
FROM scratch
USER 0
EXPOSE 8080
ENV ROCKET_PORT 8080
WORKDIR /app
COPY --from=0 /build/target/x86_64-unknown-linux-musl/release/myapp .
RUN ls -lh /app
ENTRYPOINT ["/app/myapp"]
但是,一旦将此映像部署到OSCP,我什么都不会得到。该程序只是无限期地挂起。我从容器中复制了应用程序,并尝试在Linux服务器(SMP Debian 4.9.30-2(2017-06-12)x86_64 GNU / Linux)上运行它,结果相同。我对它给予了帮助
epoll_ctl(3,EPOLL_CTL_ADD,6,{EPOLLIN|EPOLLPRI|EPOLLOUT|EPOLLET,{u32=0,u64=0}}) = 0
brk(0x564de1356000) = 0x564de1356000
socketpair(AF_UNIX,SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK,[7,8]) = 0
brk(0x564de1357000) = 0x564de1357000
rt_sigaction(SIGINT,NULL,{sa_handler=SIG_DFL,sa_mask=[],sa_flags=0},8) = 0
rt_sigaction(SIGINT,{sa_handler=0x564de08a8b10,sa_flags=SA_RESTORER|SA_RESTART|SA_SIGINFO|SA_NOCLDSTOP,sa_restorer=0x564de08f5716},8) = 0
fcntl(7,F_DUPFD_CLOEXEC,0) = 9
fcntl(9,F_SETFD,FD_CLOEXEC) = 0
epoll_ctl(3,9,{u32=1,u64=1}}) = 0
getsockname(6,{sa_family=AF_INET,sin_port=htons(8000),sin_addr=inet_addr("127.0.0.1")},[128->16]) = 0
futex(0x7ffe331e9284,FUTEX_WAIT_PRIVATE,2,NULL
似乎在等待futex时应用程序死锁,我只是不知道为什么(以及为什么Windows上不会发生)。我已经尝试使用x86_64-unknown-linux-gnu进行编译并切换到系统分配器,但都无济于事。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。