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

在Clojure中,如何向Clojure.java.shell/sh创建的进程发送退出命令

在Clojure中,可以使用Clojure.java.shell/sh函数创建进程,并且可以通过向进程发送退出命令来终止进程。

要向Clojure.java.shell/sh创建的进程发送退出命令,可以使用进程的输出流(:out)或错误流(:err)来发送命令。首先,我们需要使用Clojure.java.io/writer函数创建一个写入流,然后将其传递给进程的输入流(:in)。

下面是一个示例代码,演示如何向Clojure.java.shell/sh创建的进程发送退出命令:

代码语言:txt
复制
(require '[clojure.java.shell :refer [sh]])
(require '[clojure.java.io :as io])

(let [process (sh "ls")
      exit-command "exit\n"
      writer (io/writer (:in process))]
  (.write writer exit-command)
  (.flush writer)
  (.close writer)
  (sh "echo" "Process exited with code" (:exit process)))

在上面的示例中,我们首先使用sh函数创建了一个进程,该进程执行了ls命令。然后,我们定义了一个exit-command变量,其中包含了要发送给进程的退出命令。接下来,我们使用io/writer函数创建了一个写入流writer,并将其传递给进程的输入流(:in)。然后,我们使用.write方法将退出命令写入流中,使用.flush方法刷新流,最后使用.close方法关闭流。

通过以上操作,我们成功向进程发送了退出命令。最后,我们使用sh函数执行了echo命令,打印出进程的退出状态码。

请注意,上述示例中的命令仅用于演示目的。实际使用时,你需要根据具体的需求和命令来修改代码。

关于Clojure和Clojure.java.shell的更多信息,你可以参考以下链接:

  • Clojure官方网站:https://clojure.org/
  • Clojure.java.shell文档:https://clojure.github.io/clojure/clojure.java.shell-api.html
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Docker 容器捕获信号

这些操作本质都是通过从主机容器发送信号实现主机与容器中程序交互。比如我们可以容器应用发送一个重新加载信号,容器应用程序接到信号后执行相应处理程序完成重新加载配置文件任务。...容器信号 Docker stop 和 kill 命令都是用来向容器发送信号。注意,只有容器 1 号进程能够收到信号,这一点非常关键!...,执行命令: $ docker container kill --signal="SIGTERM" my-app 此时应用会以我们期望方式退出: 应用程序不是容器 1 号进程 创建一个启动应用程序脚本文件...它们最终都是容器 1 号进程发送了 SIGKILL 信号。...很显然这不是我们期望,我们希望程序能够收到 SIGTERM  信号优雅退出脚本捕获信号 创建另外一个启动应用程序脚本文件 app2.sh,内容如下: #!

2.6K20

Storm集群安装详解

本文以Twitter Storm官方Wiki为基础,详细描述如何快速搭建一个Storm集群,其中,项目实践遇到问题及经验总结,相应章节以“注意事项”形式给出。 1....每一个工作进程执行一个Topology子集;一个运行Topology由分布不同工作节点上多个工作进程组成。...此外,Nimbus和Supervisor进程都是快速失败(fail-fast)和无状态(stateless);Storm集群所有的状态要么Zookeeper集群,要么存储本地磁盘上。...dataDir目录下创建myid文件,文件只包含一行,且内容为该节点对应server.idid编号。 5....(fail-fast),且遇到任何错误情况,进程均会退出,因此,最好能通过监控程序将Zookeeper管理起来,保证Zookeeper退出后能被自动重启。

1.8K10

滚动 Docker Nginx 日志

创建滚动日志脚本 创建 rotatelog.sh 文件,其内容如下: #!...最后通过 kill 命令 nginx master 进程发送 USR1 信号。...笔者这《 docker 容器捕获信号》一文中介绍了容器中信号捕获问题,感兴趣朋友可以去看看。在那篇文章我们介绍了 docker 容器中进程发送信号 kill 命令。...我们可以通过命令: $ docker container kill mynginx -s USR1 容器 1 号进程(nginx master)发送 USR1 信号(这种方式只能 1 号进程发送信号...这种方式不需要通过 docker exec 命令容器执行命令,而完全宿主机完成所有的操作: 先重命名容器数据卷日志文件 给容器 1 号进程发送 USR1 信号 总结 相比之下我还是更喜欢第一种方式

1.3K20

面试官:能在容器里面通过 kill -9 杀死容器吗?问倒一大片。。。

如果是后台进程,那么需要使用 kill 命令来终止(其实 Ctrl+C 也是kill命令)。 kill命令默认将信号(signal)15发给进程,让进程优雅地退出,释放资源。...而kill -9则是强制终止进程,相当于发送信号9,不管进程是否想要退出,都会被迫停止运行。...当然可以,docker kill 命令就是容器外通过发送SIGKILL杀死容器,因为宿主机上,这个init进程ID已经不再是 1 了。 那我们可以容器内部通过信号杀死自己吗?...可以通过 docker ps 命令来获取当前正在运行容器列表及其 ID。执行上述命令后,Docker 会容器发送一个 SIGTERM 信号,请求它优雅地停止。...另外,也可以使用以下命令来直接强制停止容器: docker kill 这个命令容器发送一个SIGKILL信号,直接杀死该进程并终止容器。

34710

.NET Core 跨平台执行命令、脚本

一.前言 我们可能会遇到需要在程序执行一些系统命令,来获取一些信息;或者调用shell脚本。.NET Core 目前已经可以跨平台执行,那么它如何跨平台执行命令呢,请看下面的讲解。...arguments:进程启动时传递给应用程序命令行参数。 (2)主要属性 CreateNoWindow:指示是否新窗口中启动进程。...Close:释放与此组件关联所有资源。 CloseMainWindow:通过其主窗口发送关闭消息来关闭具有用户界面的进程。 Kill:立即停止关联进程。...Refresh:放弃已经进程缓存关联进程任何信息。 WaitForExit:等待关联进程退出,可以设置超时时间,如不设置则一直等待。...Exited:关联进程退出 三.Windows OSX Linux 下执行命令 这里我选择.NET Core带 dotnet --info输出.NET Core SDK&Runtime相关信息。

1.9K20

docker与gosu

镜像创建非root账号 既然不能用root账号,那就要创建其他账号来运行进程了,以redis官方镜像Dockerfile为例,来看看如何创建账号,如下图,地址是:https://github.com...Dockerfile脚本未发现USER redis命令,这意味着执行docker-entrypoint.sh文件身份是root; 其次,docker-entrypoint.sh没有发现su...,此时宿主机该容器发送信号量,收到信号量是sudo进程。...而不是sudo; entrypoint.sh脚本执行时候也是个进程,启动业务进程时候,命令前面加上exec,这样新进程就会取代entrypoint.sh进程,得到1号PID; exec "$...如何在镜像安装gosu 前面的redis例子,我们看到docker-entrypoint.sh中用到了gosu,那么是在哪里安装了gosu呢?

3.8K51

golang子进程启动和停止,mac与linux区别

简单调试后就找到了原因,系统启动进程,发出终止信号之后居然仍在运行,导致父进程也一直无法退出,尴尬了。...而发出退出命令时候,只有sh退出了,sleep进程仍然继续运行。对比同样mac电脑上,sh进程是没有出现,只有一个sleep进程,所以发出退出命令时候,sleep正常关闭,系统表现正常。...程序,linux上也只有sleep这一个进程被建立,直接其发出退出指令是可以正常工作。...最后再说一下命令cmd.Process.Signal,golang文档上说很清楚,这是进程发送消息信号,比如同样syscall.SIGQUIT,这也是告诉子进程退出意思。...sh启动了另外一个子进程,这种方法就无效了(指在linux无效,mac测试是一样可以用,关键区别同样是mac,/bin/sh进程不会保留并等待我们启动进程退出,所以退出消息可以正常发送到正常进程

4.5K50

Tomcat 优雅关闭之路

,深入分析不同Tomcat关闭方式背后原理,让开发人员能够了解使用不同关闭方式时需要注意点,避免因JVM进程异常退出导致各种非预见性错误。...2、服务器上,我们还可以利用kill -x命令来结束Tomcat进程。...比如我们平常开发过程,常用创建线程池操作Executors.newFixedThreadPool(n) 便会创建n个用户线程,这些线程main主线程退出后,并不会自动回收,从而阻止了JVM正常退出...四、kill -x 1、kill -9 or kill -15 Linuxkill -x操作是目标进程发送对应信号量。可以用kill -l命令查看每个数值所代表信号量值。...kill -15是进程发送一个TERM中断信号量,JVM接收到该信号量后,会响应中断,进而结束当前进程

3.4K20

容器应用优雅关闭终极大招

目前业务系统组件众多,互相之间调用关系也比较复杂,一个组件下线、关闭会涉及到多个组件 对于任何一个线上应用,如何保证服务更新部署过程从应用停止到重启恢复服务这个过程不影响正常业务请求,这是应用开发运维团队必须要解决问题...所以容器应用如果应用容器启动 shell,占据了 pid=1 位置,那么就无法接收 k8s 发送 SIGTERM 信号,只能等超时后被强行杀死了。...所以容器应用如果应用容器启动 shell,占据了 pid=1 位置,那么就无法接收 k8s 发送 SIGTERM 信号,只能等超时后被强行杀死了。...传统部署模式下,这部分工作可能需要人工处理,但是 K8s 容器平台中,K8s Pod 删除默认就会容器进程发送优雅停机命令,并提供了默认 30s 等待时长,若优雅停机处理超出 30s...tini 和 dumb-init 会将关闭信号进程传递,但不会等待子进程完全退出后自己退出。而是传递完后直接就退出了。

2.5K41

Docker容器中进程管理工具

Linux系统,PID为1进程需要担任两个重要使命: 传递信号给子进程 如果pid为1进程,无法其子进程传递信号,可能导致容器发送SIGTERM信号之后,父进程等待子进程退出。...此时,如果父进程不能将信号传递到子进程,则整个容器就将无法正常退出,除非进程发送SIGKILL信号,使其强行退出,这就会导致一些退出操作无法正常执行,例如关闭数据库连接、关闭输入输出流等。...接管孤儿进程,防止出现僵尸进程 如果一个进程A运行了一个子进程B,而这个子进程B又创建了一个子进程C,若子进程B非正常退出(通过SIGKILL信号,并不会传递SIGKILL信号给进程C),那么子进程C...docker,docker stop命令发送SIGTERM信号给容器进程来处理。...类似于一个初始化系统, 它充当PID 1,并立即以子进程形式允许您命令,注意在接收到信号时正确处理和转发它们 dumb-init 解决上述两个问题:进程代理发送信号和接管子进程

1.1K30

docker stop 或者 docker kill 不能停止容器

-xe -u docker 然后短暂时间内 docker ps查看到容器还在运行,过了一会没有了我们创建时候会提示这个容器已经存在(如果建立同样名称容器) docker stop 主流程...1,docker 通过 containerd 容器主进程发送 SIGTERM(终止进程)信号后等待一段时间后(默认是10s,可以通过-t 参数来修改),如果从containerd 收到了容器退出消息...但是对于容器来说,init 系统进程并不是必须,所以当我们停止容器时候,docker 通过 containerd 容器Pid 为 1 进程发送 SIGTERM信号并不一定会被采纳。...在上一步如果等待超时,Docker引擎将跳过 containerd 自己亲自动手通过kill系统调用容器主进程发送 SIGKILL 信号。...一般情况下,父进程应该立即调用 wait(), 以防僵尸进程时间过长。 如果父进程进程之前退出,子进程会变成孤儿进程, 它进程会变成 PID 1。

4.1K20

docker | dockerfile最佳实践

真实情况要远比这三条规律复杂,好在 docker 给出了官方解释,如下图所示: 容器优雅退出 众所周知,docker容器本质上是一个个进程进程优雅退出需要考虑如何正确处理 SIGTERM...信号,关于这点在我另一篇博文中介绍过 kill命令详解以及linux信号 无论是 docker stop 还是 kubernetes 中使用容器,一般关闭容器都是容器内 1 号进程发送 SIGTERM...信号,等待容器自行进行资源清理等操作,等待时间 docker 默认 10s,k8s 默认 30s,如果容器仍未退出,则发送 SIGKILL 信号强制杀死进程 综上,我们只需要考虑 2 点 应用程序如何处理信号...这就需要在应用程序定义对信号处理逻辑了,包括对每个信号如何处理如何转发给子进程等。...Tini 可以确保容器应用程序启动和退出时正确处理信号,避免僵尸进程和其它常见问题出现。

90110

Python 执行系统命令

system函数可以将字符串转化成命令服务器上运行;其原理是每一条system函数执行时,其会创建一个子进程系统上执行命令行,子进程执行结果无法影响主进程。...一些复杂场景,我们需要将一个进程执行输出作为另一个进程输入。另一些场景,我们需要先进入到某个输入环境,然后再执行一系列指令等。...3、Popen.communicate(input=None):与子进程进行交互。stdin发送数据,或从stdout和stderr读取数据。可选参数input指定发送到子进程参数。...注意:如果希望通过进程stdin发送数据,创建Popen对象时候,参数stdin必须被设置为PIPE。...4、Popen.send_signal(signal):进程发送信号。 5、Popen.terminate():停止(stop)子进程

1.6K10

docker stop 或者 docker kill 不能停止容器

-xe -u docker 然后短暂时间内 docker ps查看到容器还在运行,过了一会没有了我们创建时候会提示这个容器已经存在(如果建立同样名称容器) docker stop 主流程...1,docker 通过 containerd 容器主进程发送 SIGTERM(终止进程)信号后等待一段时间后(默认是10s,可以通过-t 参数来修改),如果从containerd 收到了容器退出消息...但是对于容器来说,init 系统进程并不是必须,所以当我们停止容器时候,docker 通过 containerd 容器Pid 为 1 进程发送 SIGTERM信号并不一定会被采纳。...在上一步如果等待超时,Docker引擎将跳过 containerd 自己亲自动手通过kill系统调用容器主进程发送 SIGKILL 信号。...一般情况下,父进程应该立即调用 wait(), 以防僵尸进程时间过长。 如果父进程进程之前退出,子进程会变成孤儿进程, 它进程会变成 PID 1。

6.6K82

nohup 命令 解决 SSH关闭窗口,程序也中断问题!

原因 主要元凶: 挂断信号(SIGHUP) 信号 概念介绍 Linux/Unix,有这样几个概念: 进程组(process group): 一个或多个进程集合,每一个进程组有唯一一个进程组ID,即进程组长进程...一个进程退出导致一个孤儿进程组产生时, 如果任意一个孤儿进程进程处于STOP状态, 发送 SIGHUP 和 SIGCONT 信号到该进程组中所有进程....如何解决方案 远端开启 tmux , tmux 里运行程序, 此时运行程序属于 tmux 进程组, 不属于 ssh 进程组....使用 nohup 命令 Linux nohup 命令 nohup 英文全称 no hang up(不挂起),用于系统后台不挂断地运行命令退出终端不会影响程序运行。...nohup 命令默认情况下(非重定向时),会输出一个名叫 nohup.out 文件到当前目录下,如果当前目录 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件

5.2K20

Python大数据之PySpark(二)PySpark安装

,从节点主机名和端口号 3-现象:进入到spark-shell或pyspark,会开启4040端口webui展示,但是一旦交互式命令退出了,wenui无法访问了,需要具备Spark历史日志服务器可以查看历史提交任务...Driver,告诉任务需要多少cpu或内存 Worker进程负责干活, Master汇报状态, 并听从程序Driver安排,创建Executor干活 Worker中有Executor,Executor...步骤: 如果使用crt上传文件一般使用rz命令,yum install -y lrzsz 1-3台虚拟机上准备anconda 2-安装anaconda,sh anaconda.sh 3-安装pyspark...#driver申请作业资源,会--master集群资源管理器申请 #执行计算过程worker,一个worker有很多executor(进程),一个executor下面有很多task(线程)...阶段划分完成和Task创建后, Driver会Executor发送 Task; 3)、Executor接收到Task后,会下载Task运行时依赖,准备好Task执行环境后,会开始执行Task

1.3K30

【管理工具】进程管理工具Supervisor(送书活动)

Supervisor服务器端称为supervisord,主要负责启动自身时启动管理进程,响应客户端命令,重启崩溃或退出进程,记录子进程stdout和stderr输出,生成和处理子进程生命周期中事件...可以一个配置文件配置相关参数,包括Supervisord自身状态,其 管理各个子进程相关属性。配置文件一般位于/etc/supervisord.conf。...(用于接收进程管理命令) supervisorctl #客户端(用于和守护进程通信,发送管理进程指令) echo_supervisord_conf #生成初始配置文件程序 创建配置文件 一般可以通过运行.../bin/catalina.sh run ; 程序启动命令 autostart=true ; supervisord启动时候也自动启动 startsecs=10 ; 启动10秒后没有异常退出...;默认为false,进程被杀死时,是否这个进程发送stop信号,包括子进程 killasgroup=false ;默认为false,进程发送kill信号,包括子进程 [include]

1.5K20

书中关于伪终端一个纰漏

当 slowout 结束时,子进程读伪终端主设备时返回 0,它知道工作进程结束后,也即将结束自己工作, 但是父进程一直卡在读终端输入上,并不知道工作进程已经退出,于是 pty 子进程进程发送一个...同理,当 pty 父进程检查到 stdin 上无更多输入后,会 pty 子进程发送 SIGTERM 信号(前提是子进程发送相同信号),从而终结子进程等待 。...作者认为问题出现在 pty 父进程 pty 子进程发送这个 SIGTERM 信号上,因为重定向到 /dev/null 后,pty 父进程会从 stdin 读到 EOF, 从而 pty 子进程发送.../slowout 可以通过 ps 命令观察到卡死进程,7650 为 pty 子进程,7649 为 slowout 子进程,7648 为 pty 父进程退出。...4 6 resp=$(read -p "type any char to continue") 7 } 如果使用 slowout.sh 作为工作进程,启动命令也需要改变一下: >.

41720

Golang信号处理和如何实现进程优雅退出

kill pid作用是进程号为pid进程发送SIGTERM(这是kill默认发送信号),该信号是一个结束进程信号且可以被应用程序捕获。...kill -9 pid则是进程号为pid进程发送SIGKILL(该信号编号为9),从本文上面的说明可知,SIGKILL既不能被应用程序捕获,也不能被阻塞或忽略,其动作是立即结束指定进程。...若通过kill结束进程是一个创建过子进程进程,则其子进程就会成为孤儿进程(Orphan Process),这种情况下,子进程退出状态就不能再被应用进程捕获(因为作为父进程应用程序已经不存在了)...所谓优雅退出,其实就是避免暴力杀死进程,让进程接收到信号之后,自动做一些善后处理,再自己自愿退出。...信号处理函数逻辑越简单越好,通常做法是该函数设置一个bool型flag变量以表明进程收到了SIGTERM信号,准备退出。 2)进程main(),通过类似于while(!

2.5K40
领券