我正在写一个bash脚本,它做了几件事.
最初它启动了几个监视器脚本,每个脚本都运行一些其他工具.
在我的主脚本结束时,我想杀死从我的shell中生成的所有东西.
所以,它可能看起来像这样:
#!/bin/bash
some_monitor1.sh &
some_monitor2.sh &
some_monitor3.sh &
do_some_work
...
kill_subprocesses
Run Code Online (Sandbox Code Playgroud)
问题是这些监视器中的大多数都会生成自己的子进程,所以这样做(例如):killall some_monitor1.sh并不总是有用.
还有其他办法可以处理这种情况吗?
长话短说,我们正在分发一款免费软件.代码是GNU/GPL许可证,我们尝试与原始开发人员合作,但没有成功.我们正在改进软件,添加了许多功能,不太可能将我们的代码合并到原始代码中.
我们希望使用新名称调用新项目,当然使用相同的许可证并更改每个文件中的版权声明.
我知道GNU/GPL应该允许修改代码和重新分发,但这里有一些问题:
如果我有一个使用线程运行的程序并fork()在基于 unix 的系统上调用,线程是否被复制?我知道当前进程的虚拟内存以 1:1 的比例复制到生成的新进程中。我知道线程在进程的虚拟内存中有自己的堆栈。因此,至少也应该复制线程堆栈。但是,我不知道不驻留在虚拟内存中的线程是否还有其他内容,因此不会被复制。如果没有,这两个进程是共享线程还是独立的副本?
我有一个流程x,我想检查泄漏valgrind.问题在于x运行y,y反过来运行z.我不能x独立运行因为y并z设置环境x,例如环境变量,命令行开关,所需的文件x等.
valgrind继续运行z但是要跟踪它找到的任何叉子并报告它们吗? valgrind跟踪任何问题,但只报告名为的进程x吗? valgrind附加已经运行的进程,我可以用gdb做的方式吗?我不知道这是否重要,但我在SuSE64 linux和valgrind-2.4.0下运行.
谢谢!
我正在做一些关于CultureGrid的业余时间编码.他们有一个SOLR API来访问1.2米的文化艺术品.我已经发布了一个gem来使用它们的服务,但我对使用Datamapper和SOLR适配器后端以更好的方式做到这一点有了一个很好的想法.
我刚刚在Github上发现了一个名为dm-solr-adapter的项目.它是2008年其他人工作的一个分支,使用它你必须克隆项目并运行一个rake任务来安装它(在heroku上使用不多,所以我必须提供它).不幸的是,这项任务现在被打破了,因为他们没有固定他们的宝石版本,Bones在版本2和3之间发生了很大的变化.
基本上 - 它需要一些重新编码才能让它成为一个宝石,如果我要这样做,我不妨自己释放它并按我所知的方式去做 - 使用珠宝商代替.
所以,当然我会删除所有作者,但我只是想知道这里的道德和礼仪是什么.我是否在gem中包含我的用户名,还是使用原始的gem名称?这可能会破坏其他人的安装,即使gem没有列在Rubygems.org上吗?我遵循他们的编号惯例吗?他们似乎选择了"1.0.0"并坚持下去,没有进一步的活动.或者我只是从版本0.1.0开始?
如果不这样做,我只是抓住我想要的东西,将它包含在我的新项目中并给出帽子提示?对于那些可能想要做同样事情的人来说,这听起来并不是很有用.
或者我可能会把我觉得有用的东西拿出来,制作一个叫做dm-solr-backend之类的全新宝石并从头开始?
哦,困境 - 你会做什么?
pthread和fork wrt linux在实现差异以及调度如何变化(它是否变化?)方面的基本区别是什么?
我在两个类似的程序上运行strace,一个使用pthreads而另一个使用fork,最后make clone()syscall都有不同的参数,所以我猜这两个在linux系统上基本相同,但是pthreads更容易处理在代码中.
有人可以给出深刻的解释吗?
编辑:另见相关问题
我在github上分叉了一个存储库.我做了一些修改并做了一个拉取请求.
现在我做了一些其他的更改并想要做一个新的pull请求,但在执行pull请求之前的预览屏幕上它也显示了旧的提交(已经接受的提交).
如何仅在我的分叉存储库的主分支中选择最新提交,以便我可以仅使用该提交执行拉取请求?
所以,我已经习惯了fork(),我知道它做了什么.作为初学者,我非常害怕它(我仍然不完全理解它).fork()你可以在网上找到的一般描述是,它复制当前进程并分配不同的PID,父PID和进程将有不同的地址空间.一切都很好,但是,鉴于这个功能描述,初学者会想知道"为什么这个功能如此重要......为什么我要复制我的过程?".所以我确实很奇怪,最终我发现你可以通过execve()家庭来调用当前流程中的其他流程.
我仍然不明白为什么你必须这样做?最合乎逻辑的是拥有一个可以调用的函数
create_process("executable_path+name",params..., more params);
Run Code Online (Sandbox Code Playgroud)
这会生成一个新进程并在main()的开头运行它并返回新的PID.
困扰我的是fork/execve解决方案正在进行可能不需要的工作的感觉.如果我的进程使用大量内存怎么办?内核是否复制了我的页面表等.我确信它不会真正分配实际内存,除非我触及它.另外,如果我有线程会发生什么?在我看来,它太乱了.
几乎所有关于fork的描述,比如它只是复制进程并且新进程在fork()调用之后开始运行.这确实发生了什么,但为什么会这样发生?为什么fork/execve是产生新进程的唯一方法,以及从当前创建新进程的最常用的unix方法是什么?有没有其他更有效的方法来产生进程?**这不需要复制更多的内存.
这个帖子谈到同样的问题,但我发现它不太令人满意:
谢谢.
在"Unix环境中的高级编程",第2版,作者:W.Richard Stevens.
第8.3节fork函数.
这是描述:
父和子共享相同的文件偏移量很重要.
考虑一个分叉孩子的过程,然后等待孩子完成.假设两个进程都写入标准输出作为其正常处理的一部分.如果父级的标准输出重定向(可能是shell),则当子级写入标准输出时,子级必须更新父级的文件偏移量.
[1.这是什么意思?例如,如果父项的std输出被重定向到'file1',那么子项写入后子项应该更新什么?parent的原始std输出偏移量或重定向输出(即file1)偏移量?不能晚了,对吧?
[2.更新是如何完成的?由子显式,由OS隐式地,由文件描述符本身?在fork之后,我认为父母和孩子走自己的路,并拥有自己的文件描述符COPY.那么孩子如何更新偏移到父方?]
在这种情况下,孩子可以在父母等待时写入标准输出; 在孩子完成后,父母可以继续写入标准输出,知道其输出将附加到孩子写的任何内容.如果父级和子级没有共享相同的文件偏移量,则此类交互将更难以完成,并且需要父级的显式操作.
如果父节点和子节点都写入相同的描述符,而没有任何形式的同步,例如让父节点等待子节点,则它们的输出将被混合(假设它是在fork之前打开的描述符).虽然这是可能的,但这不是正常的操作模式.
在fork之后处理描述符有两种正常情况.
父母等待孩子完成.在这种情况下,父级不需要对其描述符执行任何操作.当子进程终止时,子进程读取或写入的任何共享描述符将相应地更新其文件偏移量.
父母和孩子都有自己的方式.这里,在fork之后,父关闭它不需要的描述符,并且子进行相同的操作.这样,既不会干扰对方的开放描述符.网络服务器经常出现这种情况."
[3.当调用fork()时,我理解的是那个子得到了父有什么的COPY,在这种情况下是文件描述符,并做了它的事情.如果任何偏移更改为父和子共享的文件描述符,则只能因为描述符记住偏移本身.我对吗?]
对不起,我对这些概念不太了解.
有帮助吗?谢谢.
经过一番探索,在我的理解中,它与贡献有关.
Fork意味着将存储库(正在分叉的存储库)的副本复制到我自己的github帐户中.如果我想分叉官方jQuery存储库,那么我将转到https://github.com/jquery/jquery并点击"Fork"按钮,GitHub将存储库(jquery)复制到我的帐户(http:// github.com/yegya).然后,我将在http://github.com/yegya/jquery上提供该存储库的复制版本
现在,我可以对我的存储库进行任何更改,然后将拉取请求发送到原始存储库(jQuery的存储库),要求jQuery团队将我的更改合并到其原始存储库中.
我是否理解得当,或者它意味着什么更多或其他什么?