我很犹豫要不要发布这个问题,因为我认为某个地方已经有人问过了,但是经过大量的搜索,我发现它是空的,所以就在这里。
背景:我正在运行一个本地代理(用 C 编写,通过 TCP 侦听),它允许远程执行少量脚本/命令。(具体来说,通过 Web 界面。)脚本本身是二进制文件、bash 或 perl 脚本的混合体,只要列表中允许它们,代理本身并不真正关心。
(这是在公司内部网络上,处于早期阶段,所以此时请不要争论安全性的优点。)
启动进程的 C 代理代码是这样的:
sprintf(mrun, "%s %s 2>&1", file, args);
mexec = popen(mrun, "r");
[read some returned buffer]
pclose(mexec);
这种方法适用于外部 bash 和 perl 脚本,前提是脚本只执行命令(或在前台执行操作)。但是,我最近需要扩展一个脚本以包含一个守护进程的重新启动,在本例中,命名为。
脚本本身(bash)很简单:
#!/bin/bash
pkill -9 named
/local/mnt/named/sbin/named -c /local/mnt/named/var/named.conf &
echo "restarted"
我遇到的问题是脚本在通过 C 代理运行时永远不会完成(即重新启动永远不会回显),因此永远不会返回控制并且 TCP 套接字永远不会被释放。就代理而言,该进程仍在运行。如果我从终端运行脚本,它可以正常工作,并且控制权会返回给我。
我是否遗漏了一些可以让脚本在从 C 守护程序分叉时正常执行而不是从 bash 终端调用的东西?
我知道 nohup 并且我想如果所有其他方法都失败了可以使用它,但我很好奇是否有其他类型的解决方法可以做到这一点。