假设在nodejs, 我们都知道通过spawn一个子进程获取到stdin 可以写数据到子进程,再监听子进程的stdout把它原封不动打印出来
求教:如何给一个正在运行中的进程(邻居)发送数据/指令呢?
场景:我想要在Erlang的shell里自动/实时运行更新的代码文件(用VSCode快捷键保存),我思路就是用node写个监听辅助进程,setInterval 监控代码文件的修改时间,如有更新就发送命令给shell(就是发送一些文本加一个回车键到Erlang shell 的进程里对吧?)
假设在nodejs, 我们都知道通过spawn一个子进程获取到stdin 可以写数据到子进程,再监听子进程的stdout把它原封不动打印出来
求教:如何给一个正在运行中的进程(邻居)发送数据/指令呢?
场景:我想要在Erlang的shell里自动/实时运行更新的代码文件(用VSCode快捷键保存),我思路就是用node写个监听辅助进程,setInterval 监控代码文件的修改时间,如有更新就发送命令给shell(就是发送一些文本加一个回车键到Erlang shell 的进程里对吧?)
这事我好像也做过,后来发现根本无此必要,可以是代码文件只要按了快捷键保存就自动触发各种操作,发送命令给shell什么的,没必要在搞个监听辅助进程。但vsc不清楚怎么像emacs一样加save-hook
我用Lisp写过类似的函数 watch-file
(场景:我在VSCode一保存修改某个(本地的)CSS文件,所有打开的(线上的)小程序立刻就会更新 )
因为搜查过没有监听文件更新的函数(无论是node还是Lisp),那就耿直地用 loop+check-file-write-date+sleep
去实现,估计save-hook
/node-watch
也是用类似的原理
很多事情好像没那么难,我说的用node实现这个小工具也可能就十几行代码而已啊。。。
@cireu 造轮子其实挺好玩的啊,自己能够掌握其原理,说不准什么时候就把系统内核的轮子造出了(我们大都是被吓跑了,听到“内核”两个字就大惊失色/闻风丧胆了)
估计也是类似地setInterval ,我保存一个文件后过了两秒那个Source Control
的图标才更新过来
这些我好像考虑过,但是能否对一个”陌生“的、已经在运行的程序发送命令再输出,而不是对自己的子进程
我试了用 tmux
运行 erl
在用 tmux send-keys
就可以(我上次提问过) 不过这是基于 tmux 的子进程
而直接用 fd 发送 输入就 不可以
或许简单点就直接把erl shell
放在子进程,再监听 stdout
和控制stdin
就好了
为啥只能想到通过 stdio 控制?
当然是两边约定一个通讯协议灵活性更大。
很简单,因为对大部分操作系统来说不能两个进程同时打开一个文件进行写入
proc 下的 fd 用的是一种特殊的映射方法 proc - Writing to stdin of a process - Unix & Linux Stack Exchange
因为那边是一个 官方的 erl
程序啊,我是不是应该再稍微”包装“一下这个程序?
我想还是用子进程就简单了
嗯,我搜一下确实也有遇到同样的疑问的:
那是不是意味着假如我照常打开 shell
(iTerm/zsh/bash) 后运行一个进程erl
,我要在另外一个进程发送命令的话就要借助父进程shell
?还是也没戏?
看来这问题是不好解决的了,所以也要超级感谢tmux
这些超级实用的utility了
之前写 Elixir 的时候开发的插件,后来不写 Elixir 了。