2016-09-13 3 views
0

私はbashスクリプトを実行しているPythonスクリプトを持っています。私はbashスクリプトを無限にすることができ、chroot jailで実行する必要がある場合はスクリプトを危険にさらす可能性があるので、killする必要があります。私はpsutil.Popen()とそれを実行し、2秒間実行しておきます。自然に終了しない場合は、SIGKILLとその可能なすべての子供に送付します。Linux - SIGSTOPの理由と対処方法

問題は、時間外実行のために1つのスクリプトを終了し、別のスクリプトを実行すると、メイン(Python)スクリプトがSIGSTOPを受け取るということです。私のローカルマシンでは、私は本当にばかげた解決策をとった:Pythonスクリプトは起動時にそのPIDをファイルに書き込んだ後、ファイルに格納されたPIDに毎秒SIGCONTを送る別のスクリプトを実行する。これには2つの問題があります。それは本当にばかげていますが、さらに悪いことにサーバーでの作業を拒否しているということです。SIGCONTは何もしません。

シーケンスは次のとおりです。Pythonスクリプトはjailに応答するbashスクリプトを実行し、そのbashスクリプトは恐らく危険なスクリプトや無限のスクリプトを実行します。このスクリプトにはいくつかの子供もいるかもしれません。

コードの関連部分:

メインのPythonスクリプトのchroot($ 1のスクリプトは、$ 2が刑務所chroot監獄で実行するスクリプトです実行

p = psutil.Popen(["bash", mode, script_path, self.TESTENV_ROOT]) 
    start = time.time() 

    while True: 
     if p.status() == psutil.STATUS_ZOMBIE: 
      # process ended naturally 
      duration = time.time() - start 
      self.stdout.write("Script finished, execution time: {}s".format(duration)) 
      break 

     if time.time() > start + run_limit: 
      children = p.children(recursive=True) 
      for child in children: 
       child.kill() 
      p.kill() 
      duration = None 
      self.stdout.write("Script exceeded maximum time ({}s) and was killed.".format(run_limit)) 
      break 

     time.sleep(0.01) 

    os.kill(os.getpid(), 17) # SIGCHLD 
    return duration 

パス)

#!/usr/bin/env bash 

# copy script to chroot environment 
cp "$1" "$2/prepare.sh" 

# run script 
chmod u+x "$2/prepare.sh" 
echo './prepare.sh' | chroot "$2" 
rm "$2/prepare.sh" 

例prepare.shスクリプト

#!/bin/bash 
echo asdf > file 

私はこの問題を解決しようとしていましたが、私は(bashのスクリプトを実行するためにchroot監獄を使用していません)このスクリプトは完璧に動作していることが分かった:

import psutil 
import os 
import time 

while True: 
    if os.path.exists("infinite.sh"): 
     p = psutil.Popen(["bash","infinite.sh"]) 
     start = time.time() 

     while True: 
      if p.status() == psutil.STATUS_ZOMBIE: 
       # process ended naturally 
       break 

      if time.time() > start + 2: 
       # process needs too much time and has to be killed 
       children = p.children(recursive=True) 
       for child in children: 
        child.kill() 

       p.kill() 
       break 

     os.remove("infinite.sh") 
     os.kill(os.getpid(), 17) 

私の質問は以下のとおりです。

  • 私はSIGSTOP Sを受け付けておりますのはなぜ?それはchrootの刑務所のためですか?
  • "目を覚ます"スクリプトを実行するよりも私の問題を解決する方法はありますか?

あなたのアイデアをお寄せいただきありがとうございます。

EDIT:私が残業をした後、最初のスクリプトを実行する瞬間に私は拍手がかかっていることが分かりました。私がos.systemまたはpsutil.Popenを使用しても問題ありません。

EDIT2: chroot jailを制御するbashスクリプトでは、私はさらに調査を行い、重要な行はecho './prepare.sh' | chroot "$2"です。問題は今、何が間違っているのですか?

EDIT3:This誰かを助ける場合は、関連する問題かもしれません。

+0

この 'prepare.sh'スクリプトを投稿できますか? – ElmoVanKielmo

+0

私の投稿を編集しました。 – karlosss

答えて

関連する問題