私は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誰かを助ける場合は、関連する問題かもしれません。
この 'prepare.sh'スクリプトを投稿できますか? – ElmoVanKielmo
私の投稿を編集しました。 – karlosss