首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在bash上异步运行远程进程,并在文件中获取其远程pid、stdout+stderr和退出代码

在Bash中异步运行远程进程并捕获其PID、标准输出(stdout)、标准错误(stderr)以及退出代码,可以通过以下步骤实现:

基础概念

  • 异步执行:指的是在不等待一个命令完成的情况下继续执行下一个命令。
  • 远程进程:在另一台机器上运行的进程。
  • PID:进程标识符,是唯一标识一个进程的数字。
  • stdout/stderr:标准输出和标准错误,分别是程序正常输出和错误信息的输出流。

相关优势

  • 资源利用:异步执行可以提高资源利用率,特别是在需要同时运行多个远程任务时。
  • 响应性:即使远程进程需要较长时间完成,也不会阻塞本地脚本的执行。

类型

  • SSH远程执行:通过SSH协议在远程机器上执行命令。
  • 后台执行:使用&符号在后台异步执行命令。

应用场景

  • 自动化脚本:在自动化部署或监控系统中,需要远程执行命令并收集结果。
  • 并行计算:在分布式计算环境中,需要同时运行多个计算任务。

实现方法

以下是一个示例脚本,展示了如何在Bash中异步运行远程进程,并捕获其PID、stdout、stderr和退出代码:

代码语言:txt
复制
#!/bin/bash

# 远程主机地址
REMOTE_HOST="user@remote_host"

# 要执行的远程命令
REMOTE_COMMAND="sleep 10; echo 'Hello, World!'"

# 创建一个临时文件来存储远程命令的输出
OUTPUT_FILE=$(mktemp)

# 使用SSH在远程主机上异步执行命令,并将输出重定向到临时文件
ssh -o StrictHostKeyChecking=no $REMOTE_HOST "$REMOTE_COMMAND" > $OUTPUT_FILE 2>&1 &

# 获取远程进程的PID
REMOTE_PID=$!

echo "Remote PID: $REMOTE_PID"

# 等待远程进程完成
wait $REMOTE_PID

# 获取远程进程的退出代码
EXIT_CODE=$?

echo "Exit Code: $EXIT_CODE"

# 输出远程进程的标准输出和标准错误
echo "Output:"
cat $OUTPUT_FILE

# 清理临时文件
rm -f $OUTPUT_FILE

解释

  1. SSH远程执行:使用ssh命令在远程主机上执行命令。
  2. 异步执行:通过在命令末尾添加&符号实现异步执行。
  3. 捕获输出:使用重定向将远程命令的输出重定向到一个临时文件。
  4. 获取PID:使用$!获取最近后台进程的PID。
  5. 等待进程完成:使用wait命令等待远程进程完成。
  6. 获取退出代码:使用$?获取最近执行命令的退出代码。

遇到的问题及解决方法

  • SSH连接问题:确保远程主机的SSH服务正在运行,并且本地有权限访问远程主机。
  • 命令执行失败:检查远程命令的语法和权限,确保命令在远程主机上可以正确执行。
  • 输出捕获问题:确保输出文件路径正确,并且有写权限。

参考链接

通过上述方法,你可以在Bash中异步运行远程进程,并捕获其PID、stdout、stderr和退出代码。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

短小精干的Unix类后门Tiny shell的使用与分析

简介 Tiny Shell 是一款开源的Unix类后门shell工具,由C语言编写,体积小(kali系统编译后只有55K大小) 分为客户端和服务端,支持正向连接模式(即服务端远程运行,hacker.../sbin/bash 之后,客户端就链接不,我决定查查代码, 查了一会儿,tsh.c的236行找到了问题的原因 这里直接调用系统命令bash,而被控端的环境变量PATH值为: /usr/local/...下载文件 除了可以直接连接上去外,这个后门还可以下载上传文件 下载远程的/etc/passwd文件到当前目录 ./tsh 10.1.100.3 get /etc/passwd . 3....,父进程退出,这样fork出来的子进程就会成为孤儿进程被init托管(也就是pid为3048的进程) 当PID 为3048的这个进程成功连接上控制端监听的端口之后,则又fork一个进程用(姑且称之为子进程...2)于处理建立好的连接(tshd.c代码 211行开始) 子进程2 又会新fork一个子进程(称之为子进程3),然后子进程2退出,子进程3成为孤儿进程,被init托管,成为守护进程,子进程3是真正用户处理连接后的交互

5.6K51

大话JMeter4|不同的并发数可以自动化做压测吗?

模式 -> 非 GUI 模式下运行 JMeter -t 测试文件 -> 要运行的 JMeter 测试脚本文件 -l 日志文件 -> 记录结果的文件 -r 远程执行 -> Jmter.properties...如果你正在运行一个进程,而且你觉得退出帐户时该进程还不会结束,那么可以使用nohup命令。该命令可以在你退出帐户/关闭终端之后继续运行相应的进程。...是的,小兔说的没错,就像下面的图片一样,我们jmeter的UI界面配置的参数信息全jmx文件,比如并发数为:11 用项目实战来演示 要解释一段代码着实不容易,这里请允许用文字来表述...- nohup:这个命令前面介绍过,就不多说了,它无UI运行jmeter,缺省情况下该作业的所有输出都被重定向到一个名为nohup.out的文件代码最开始的cat是为了清空nohup.out文件。...- sleepkillJMeter:这两个命令组合起来的意思是:65秒后杀掉压测进程,因为有时候JMeter并不能正常退出

2.9K60
  • Linux | 笔记

    进程 ps -ef #查看所有进程 kill -9 12345 #立即杀死pid为12345的进程 管道 将一命令输出作为另一命令输入 ps -ef | grep php #查询名称包含php的进程...进程ID PPID = parent pid进程ID ps -l renice RedHat Linux 9 系统 如果进程启动后需重新 调整优先级,可以使用 renice...命令 renice -10 pid进程、子进程 ps ps -f 所有进程信息 ps -a 系统与 tty 相关的 所有进程 的信息 TTY: 该进程建立时 所对应的终端...,用于管理机器文件目录,使之能够被有效地存取。...,查找jdk默认安装目录 find / -name 'java' SSH 连接后,在后台运行程序 - screen 默认 SSH 连接后,退出连接,此终端运行的程序(寄宿在此bash进程)也会中断, 解决

    1.3K30

    教Linux运维人员怎样使用screen

    一个进程退出导致一个孤儿进程组中产生时,如果任意一个孤儿进程进程处于STOP状态,发送SIGHUPSIGCONT信号到该进程组中所有进程。...因此当网络断开或终端窗口关闭后,控制进程收到SIGHUP信号退出,会导致该会话期内其他进程退出。 会话实例 打开两个SSH终端窗口,在其中一个运行top命令。...---top 使用ps-xj命令可以看到,登录shell(PID 5128)top同一个会话期,shell为会话期首进程,所在进程组PGID为5128,top所在进程组PGID为5180,为前台进程组...你可以不中断screen窗口中程序的运行而暂时断开(detach)screen会话,并在随后时间重新连接(attach)该会话,重新控制各窗口中运行的程序。...你可以Screen的默认两级配置文件/etc/screenrc$HOME/.screenrc中指定更多,例如设定screen选项,定制绑定键,设定screen会话自启动窗口,启用多用户模式,定制用户访问权限控制等等

    1.9K00

    ProcessBuilder API 使用教程

    最后通过 start 方法执行命令,得到一个用于进程管理的 Process 对象,可以获取其 pid 输出结果。...: /bin/bash: xxx: command not found 输出到当前进程 在这个示例,将看到 inheritIO() 方法的作用。...:33518 exitCode:0 21 ProcessBuilder 超时与终止 进程有时不能按照自己想要的情况运行,需要对进程进行管理,常见的操作是超时控制以及进程退出。...=137] 在这段代码,destroyForcibly() 用于杀死进程,但是杀死进程并不是瞬间完成的,所以接着使用 waitFor() 来等待程序真正被杀死退出。...ProcessBuilder 异步处理 很多情况下,执行一个命令启动一个新线程后,我们不想阻塞等待进程的完成,想要异步化,进程执行完成后进行通知回调。

    51321

    Parsl-Python的高效并行编程模块

    Parsl 与 Jupyter notebook无缝协作,允许笔记本的应用程序并行执行并在远程资源执行。 一次编写,随处运行。从笔记本电脑到超级计算机Parsl 脚本独立于执行环境。...可以一个或多个执行资源执行单个脚本,而无需修改脚本。 Parsl已应用于多个科学领域的工作流多个大型超算集群部署验证,如美国国家能源研究科学计算中心(NESRC)等。...Parsl 程序提交要在分布远程计算机上的工作线程运行的任务。这些任务的说明包含在用户使用 Python 函数定义的“应用程序”。...任务执行由本地系统运行的“数据流内核”代理。 应用程序类型 Parsl 支持并发执行 Python 函数 (python_app) 或外部应用程序 (bash_app)。...调用修饰的函数时,它们在其他资源异步运行。调用 Parsl 应用程序的结果是 AppFuture, 它的行为就像一个 Python 未来。

    29930

    如何在容器执行多条指令并能优雅退出

    clone函数是作为创建进程的系统调用,所以调用此函数实际也是创建一个进程,加了CLONE_NEWPID后此进程拥有独立的进程视图,且视图内PID=1 ---- 退出 发起pod退出指令后,pod...这里有两个问题需要注意: 全程只看到给1号进程发送信号,但实际现象是容器退出后相关进程会全部消失 查阅资料后,了解到由于PID=1进程的特殊性,1号进程退出后,由其而生的PID-namespace...指定init后,将init代码嵌入容器,并作为首启动进程,特点如下: 作为容器1号进程,并创建用户定义的业务进程 默认将信号传递给子进程,也支持更多传递方式 监听子进程退出并回收 跟随最初创建的业务进程退出退出...这里提供两种方案: 全局使用 可在 /etc/docker/daemon.json 文件添加: { "init": true, } 并在启动容器时添加TINI_KILL_PROCESS_GROUP...多一些,因为构造容器config时,labelannotation不会继承pod的,而env是会完整复制pod内定义的) 代码修改比较简单,pkg/kubelet/dockershim/docker_container.go

    4.3K31

    Linux 守护进程|应急响应

    ping是前台运行进程bash是后台运行进程 执行 ping www.baidu.com & 的时候ping是后台运行进程bash是前台运行进程 ---- 如果上面涉及的所有概念你都能清晰的理解...关闭了文件描述符0、12之后,daemon通常会打开/dev/null并使用dup2()(或类似的函数)使所有这些描述符指向这个设备。...从这里可以看到,虽然我们把ssh连接退出了,但是后台进行依旧在这个session执行,还属于这个会话,所以如果session存在还在执行的后台进程,即使关闭终端或者断开ssh等远程连接,session...当一个终端关闭或者ssh等远程连接退出的时候,系统会向session管理的所有进程发送一个SIGHUP信号,这个信号就是挂断的意思,效果就是进程中断,理论问题5 ping www.baidu.com...可以看到,在当前系统,该参数为off,所以才会出现终端关闭或者ssh等远程连接断开的时候,后台进程能够继续以这个session运行 此时再说 nohup 应该就很清晰了,nohup其实就是忽略SIGHUP

    3.8K30

    写个简单的项目自动部署脚本

    : ssh-keygen 然后把~/.ssh/id_rsa.pub内容添加到远程仓库的ssh秘钥: 这样服务器就可以通过git命令从远程仓库拉取代码了。...;如果已经存在项目目录,则进入目录拉取最新代码 使用mvn命令编译打包,并输出可执行jar到target目录,如果编译失败则退出执行 找出服务进程,并发送kill执行进行终止服务进程,并且休眠10s,给服务进程足够的时间处理剩余的事情...从项目目录的target文件夹拷贝可执行jar到项目工作目录 再次检查服务进程是否已经终止,如果没有终止则强行终止(理论10s可以正常终止,休眠时间可按需调整) 通过nohup java -jar命令后台运行服务...docker start sudo systemctl enable docker 项目路径不再重复创建,还是基于一小节的路径,项目工作路径创建Dockerfile文件,内容如下: FROM openjdk...,做了以下几件事情: 从远程仓库拉取项目代码;如果已经存在项目目录,则进入目录拉取最新代码 使用mvn命令编译打包,并输出可执行jar到target目录,如果编译失败则退出执行 从项目目录的target

    30310

    如何在远程服务器运行Jupyter Notebooks?

    本文中,我将向您展示如何在远程服务器运行Jupyter Notebook,以及如何在您的笔记本上访问它。我还将演示如何设置两个bash命令以简化整个过程。...我的例子,我与其他没有共享环境安装Jupyter的人共享一个远程服务器。因此,我的第一步是转到我的项目文件夹,激活虚拟环境,并启动notebook服务器。...这是个人偏好;将本地远程笔记本放在不同的端口上,以便更容易地查看代码运行的位置。 要在远程服务器执行命令,我们运行组合命令。...最后,我ssh命令添加了-f标志,以将进程推送到后台,并在前面加上nohup命令,使进程的所有输出保持静默,以便您可以继续使用终端窗口。您可以在这里阅读有关thenohup命令的更多信息。...总结 在这篇文章,我向您展示了如何使用bash命令远程服务器启动、访问停止Jupyter Notebook,并展示了如何创建bash别名来简化操作。

    3.9K20

    让Linux服务器后台执行任务

    ,终端挂了,我就和服务器断开连接了,特别不爽,那么有没有办法终端关闭之后还继续跑着服务器的 jupyter-notebook 呢,答案肯定是有的 nohup 用 nohup 这个命令,就可以终端退出连接后服务器依旧跑着我们的代码...& 这样子的话,jupyter 就在后台运行,不会影响当前终端,并且退出之后 jupyter-notebook 还在继续运行,依然可以通过主机进行远程访问服务器,此时的输出在 nohup.out 里面...我们最好自己输出错误日志 首先我们再来回顾一下 Linux 的几个标准流,有 stdin , stdout , stderr ,分别用 0 , 1 , 2 表示,因此,我们可以通过标准流的重定向来将标准输出标准错误重定向到自定义文件...,所以,下面这样子我们就可以捕获到每次的错误信息 $ nohup jupyter-notebook --ip 0.0.0.0 >out.log 2>err.log & 用下面这个也是可以的,将输出错误信息都重定向到一个文件.../bin/bash #根据进程名杀死进程 if [ $# -lt 1 ] then echo "缺少参数:procedure_name" exit 1 fi PROCESS=`ps -ef|

    1.8K20

    Jenkins 远程启动nodejs失败,使用pm2守护Nodejs

    大致意思是,如果远程执行的命令,不是守护进程。即使加了nohup,关闭ssh连接后,当前用户启动的进程会全部终止。 因此,远程执行的命令,必须是守护进程才行。...json格式 pm2 start npm -- start这条命令是pm2的万能命令,pm2 start ,就是这一系列命令的最豪华命令。这个json我们可以理解为一个任务参数描述文件。...通过这个json文件,我们把命令行里面不好描述的各种参数放到一个json文件里面来 pm2 start .json pm2 start命令的json格式详解 ?...node_args": [],     "args": [],     "env": {            }   }] }  说明: apps:json结构,apps是一个数组,每一个数组成员就是对应一个pm2运行的应用...pid_file:自定义应用程序的pid文件 instances: min_uptime:最小运行时间,这里设置的是60s即如果应用程序60s内退出,pm2会认为程序异常退出,此时触发重启max_restarts

    2.5K20

    如何编写bash脚本以便在进程死机时重新启动进程

    UNIX,有充分的理由只能等待子进程。任何试图解决这个问题的方法(ps解析、pgrep、存储PID等)都是有缺陷的,其中存在漏洞。待后文分析。...Restart..." >&2 sleep 1 done 上面的bash代码一个until循环中运行procA。第一行启动procA并等待它结束。当它结束时,until检查其退出状态。...如果退出状态不是0,until将运行循环体,该循环体STDERR发出错误消息,并在 1 秒后重新启动循环(返回第 1 行)。 我们为什么要等一会儿?...PID重用(可能导致杀死错误的进程)。 2. PID文件过时。你需要过于更复杂的逻辑来检查PID文件是否过时,而任何这样的逻辑都同样有1的缺陷。 3....你可以/lib/systemd/system目录添加一个名为procA.service的配置文件,让systemd进程监控你的procA。

    18720

    Linux - 请允许我静静地后台运行

    一个会话只能有一个控制终端,通常是登录到其的终端设备或伪终端设备,产生在控制终端上的输入信号将发送给会话的前台进程的所有进程。...& 首先是我们最经常遇到的符号 &,将它附在命令后面可以使进程在后台执行,不会占用前台界面。它实际会话开启了一个后台作业,对作业的操作我们后面再说。...而在 shell 脚本内,setsid 不是进程组长,它不会 fork() 子进程,而是由 bash 来fork() 一个子进程,而 bash 会 wait() 子进程,所以表现得像 setsid ...; 代码 以下是 php 创建守护进程的伪代码,另外我的另一篇博客 初探PHP多进程 也稍微介绍了一些相关内容: $pid = pcntl_fork(); if ($pid > 0) { exit...又有大半个月没发博客了,最近鼓捣着重构代码,经常会在一个点纠结半天,不知不觉就加了个班。而且这个是个没法精确度量工作量目标的活儿,优化没有尽头嘛。

    1.7K50

    hw面试题解答版

    、限制非法登录次数自动退出等措施。...关闭不必要服务:关闭与系统业务无关或不必要的服务,减小系统被黑客被攻击、渗透的风险 安装杀毒软件:应安装防恶意代码软件,并及时更新防恶意代码软件版本恶意代码库。...“PID” (2)进程 检查方法: a、开始--运行--输入msinfo32,依次点击“软件环境→正在运行任务”就可以查看到进程的详细信息,比如进程路径、进程ID、文件创建日期、启动时间等。...,因此需要手动删除.bash_profile文件的记录。...默认位置:%SystemRoot%System32WinevtLogsSystem.evtx 应用程序日志:包含由应用程序或系统程序记录的事件,主要记录程序运行方面的事件,例如数据库程序可以应用程序日志记录文件错误

    91310

    【小家运维】达到Linux第三阶段的常用命令笔记记录—Part Ⅲ

    (自从有了screen命令,我再也不用怕网线不稳运行需要长时间处理数据的命令) 通常情况下我们都是为每一个这样的任务开一个远程终端窗口,因为他们执行的时间太长了。...,控制进程收到SIGHUP信号退出,会导致该会话期内其他进程退出。...用户可以通过该软件同时连接多个本地或远程的命令行会话,并在其间自由切换。 GNU Screen可以看作是窗口管理器的命令行界面版本。...它提供了统一的管理多个会话的界面相应的功能 Screen环境下,所有的会话都独立的运行,并拥有各自的编号、输入、输出窗口缓存。...假设你朋友不同地点以相同用户登录一台机器,然后你创建一个screen会话,你朋友可以在他的终端上命令(注意此处使用的命令必须是screen -x): screen -x pid 然后你自己也使用相同的命令进入到这个

    1.8K20

    goland调试go代码_debug运行

    :对正在运行进程直接进行调试(pid进程id); dlv debug:编译源文件并开始调试,这里应和 main 函数位于同一目录,或者指定完整的 main 函数路径 dlv exec filename.../hello"] 这个文件是 docker 镜像启动后的执行文件,即使用 dlv 侵入docker 运行进程id,该文件放入deploy文件夹下。.../bin/bash dlv debug --headless --listen=:2345 --api-version=2 --accept-multiclient attach $PID 这个文件用来服务器执行... $PID 为19184,执行该文件: 可以看到dlv 已经入侵到了此进程并监听2345端口,按照上文的goland添加Go Remode IP 为我的服务器IP,端口同样为2345,连接该dlv.../hello"] 这个文件用来服务器执行,把docker 镜像压缩包加载出来 install.sh: BASH 1 2 3 4 5 6 7 8 9 10 #!

    3.2K30

    TuxResponse:一款针对Linux平台的事件响应工具

    它可以Linux系统以自动化的形式执行各种事件响应任务,以帮助安全分析人员快速对系统的安全应急事件进行分类,同时不会影响最终的处理结果。...TuxResponse的帮助下,研究人员只需按一下按钮,就可以完成10个命令的输入测试。 当前版本的TuxResponse已在Ubuntu 14+CentOS 7+上进行了测试。...活动网络连接-TCP或UDP 'dump_process_select':根据PID导出进程信息 'ls -alR /proc/*/cwd 2> /dev/null | grep -E "tmp...'grep [[:cntrl:]] /var/log/*.log':查找日志 二、建立连接,使用SSH传输脚本并分析远程系统 该选项允许您连接到远程系统,复制所有脚本工具并分析系统。...五、生成HTML报告 我们所有的操作记录以及分析结果都将存储一个文本文件,因此我们可以轻松返回并查看输出。这样做的好处是,我们可以将它上传到任何一个日志分析工具并在后期加以解析。

    66510

    Linux 应急响应入门:入侵排查应该这样做

    ,因此需要手动删除.bash_profile文件的记录 检查端口连接情况: netstat -antlp | more 使用 ps 命令,分析进程,得到相应 pid 号: ps aux | grep...6666 查看 pid 所对应的进程文件路径: # $PID 为对应的 pid 号 ls -l /proc/$PID/exe 或 file /proc/$PID/exe 分析进程: # 根据pid...: kill -9 6071 注意:如果找不到任何可疑文件文件可能被删除,这个可疑的进程已经保存到内存,是个内存进程。...这时需要查找PID 然后kill掉 检查开机启动项: 系统运行级别示意图: 查看运行级别命令: runlevel 开机启动配置文件: /etc/rc.local /etc/rc.d/rc[0~6].d...在内核初始化并加载了所有模块之后,内核将启动一个守护进程叫做init或init.d。这个守护进程开始运行/etc/init.d/rc的一些脚本。

    82220
    领券