linux:启动时暂停进程

时间:2011-04-24 20:03:41

标签: linux iptables spawn

我想生成一个暂停的进程,可能在另一个用户的上下文中(例如通过sudo -u ...),为生成的进程设置一些iptables规则,继续运行进程,并删除iptable规则当过程存在时。

是否有任何标准手段(bash,corutils等)可以让我实现上述目标?特别是,如何在暂停状态下生成进程并获取其pid?

5 个答案:

答案 0 :(得分:4)

像这样写一个包装脚本start-stopped.sh

#!/bin/sh
kill -STOP $$                                    # suspend myself 
                                                 # ... until I receive SIGCONT
exec $@                                          # exec argument list

然后称之为:

sudo -u $SOME_USER start-stopped.sh mycommand &  # start mycommand in stopped state
MYCOMMAND_PID=$!
setup_iptables $MYCOMMAND_PID                    # use its PID to setup iptables
sudo -u $SOME_USER kill -CONT $MYCOMMAND_PID     # make mycommand continue
wait $MYCOMMAND_PID                              # wait for its termination
MYCOMMAND_EXIT_STATUS=$?                         
teardown_iptables                                # remove iptables rules
report $MYCOMMAND_EXIT_STATUS                    # report errors, if necessary
然而,这一切都是矫枉过正的。您不需要在挂起状态下生成进程以完成工作。只需制作包装脚本setup_iptables_and_start

#!/bin/sh
setup_iptables $$             # use my own PID to setup iptables
exec sudo -u $SOME_USER $@    # exec'ed command will have same PID

然后将其称为

setup_iptables_and_start mycommand || report errors
teardown_iptables

答案 1 :(得分:3)

您可以为您的程序编写一个C包装器,它将执行以下操作:

  1. fork并打印儿童专栏。
  2. 在孩子中,等待用户按Enter键。这会让孩子处于睡眠状态,您可以使用pid添加规则。
  3. 添加规则后,用户按Enter键。孩子使用execsystem
  4. 运行原始程序

    这会有用吗?

    编辑: 实际上你可以使用shell脚本执行上述过程。请尝试以下bash脚本:

    #!/bin/bash
    
    echo "Pid is $$"
    echo -n "Press Enter.." 
    read 
    exec $@
    

    您可以将其作为/bin/bash ./run.sh <your command>

    运行

答案 2 :(得分:0)

一种方法是登记gdb以在其主要功能开始时暂停程序(使用命令“break main”)。这将保证进程被足够快地暂停(尽管一些初始化例程可以在main之前运行,但它们可能不会做任何相关的事情)。但是,为此您需要调试要启动暂停的程序的信息。

我建议您首先手动尝试,看看它是如何工作的,然后找出如何编写脚本的方法。

或者,可以约束过程(如果确实这就是你要做的事情!)没有使用iptables,使用SELinux或基于ptrace的工具,比如sydbox。

答案 3 :(得分:0)

您可能需要PID正在启动的程序,之前该程序实际开始运行。你可以这样做。

  • 启动简单脚本
  • 强制脚本等待
    • 您可以使用 suspend 这是一个bash构建,但在最糟糕的情况下,您可以通过信号使其自行停止
  • 以您想要的各种方式使用bash流程的PID
  • 重新启动已停止的bash进程(SIGCONT)并执行 exec - 另一个内置 - 启动您的实际进程(它将继承PID

答案 4 :(得分:0)

我想你可以自己编写一个有效的函数,并且在执行exec之前,fork的子函数会自行挂起。否则,请考虑使用LD_PRELOAD lib来执行“自定义”业务。

如果你关心那么安全,你应该看看更大的枪支(chroot,也许是半虚拟化,用户模式linux等等);

最后提示:如果你不介意做更多的编码,ptrace接口应该允许你做你描述的(因为它用于实现调试器)