Tôi muốn chạy ba lệnh cùng một lúc từ Python. Định dạng lệnh là truy vấn.pl -args
Hiện tại tôi đang làm
os.system("query.pl -results '10000' -serverName 'server1' >> log1.txt") os.system("query.pl -results '10000' -serverName 'server2' >> log2.txt") os.system("query.pl -results '10000' -serverName 'server3' >> log3.txt")Tôi muốn truy vấn cả ba máy chủ cùng một lúc nhưng trong trường hợp này, mỗi lệnh chỉ thực hiện sau khi máy cuối cùng hoàn thành. Làm thế nào tôi có thể làm cho chúng đồng thời? Tôi đã nghĩ đến việc sử dụng '&' ở cuối nhưng tôi muốn phần tiếp theo của mã chỉ được chạy khi cả ba lệnh kết thúc
Hỏi ngày 28 tháng 10 năm 2009 lúc 20:28Oct 28, 2009 at 20:28
ngẫu nhiênThoughTrandomth thinkrandomThought
5.95315 Huy hiệu vàng54 Huy hiệu bạc71 Huy hiệu Đồng15 gold badges54 silver badges71 bronze badges
3
Bạn có thể sử dụng mô -đun phụ và có cả ba hoạt động độc lập: sử dụng quy trình con.popen. Chăm sóc chính xác trong việc thiết lập tham số "shell" một cách chính xác.
Sử dụng phương thức Wait () hoặc Poll () để xác định khi nào các quy trình con kết thúc.
Đã trả lời ngày 28 tháng 10 năm 2009 lúc 20:30Oct 28, 2009 at 20:30
JLDUPONTJLDUPONTjldupont
90.2K56 Huy hiệu vàng196 Huy hiệu bạc313 Huy hiệu đồng56 gold badges196 silver badges313 bronze badges
2
os.system("query.pl -results '10000' -serverName 'server1' &") os.system("query.pl -results '10000' -serverName 'server2' &") os.system("query.pl -results '10000' -serverName 'server3' &")
Trong trường hợp này - quá trình sẽ được bắt đầu trong nền
Đã trả lời ngày 28 tháng 10 năm 2009 lúc 20:36Oct 28, 2009 at 20:36
OduvanoduvanOduvan
2.4473 huy hiệu vàng22 Huy hiệu bạc24 Huy hiệu đồng3 gold badges22 silver badges24 bronze badges
1
Bạn có thể sử dụng hàng đợi
tasks = ("query.pl -results '10000' -serverName 'server1'",\ "query.pl -results '10000' -serverName 'server2'",\ "query.pl -results '10000' -serverName 'server1'") def worker(): while True: item = q.get() os.system(item) q = Queue() for i in tasks: t = Thread(target=worker) t.setDaemon(True) t.start() for item in tasks: q.put(item) q.join()Đã trả lời ngày 28 tháng 10 năm 2009 lúc 20:41Oct 28, 2009 at 20:41
OduvanoduvanOduvan
2.4473 huy hiệu vàng22 Huy hiệu bạc24 Huy hiệu đồng3 gold badges22 silver badges24 bronze badges
1
&& [...] lệnh1 && lệnh2. ....
class CliSession: def __init__(some_id): self.id = some_id self.process = subprocess.Popen("initial command here") def run(command_str): self.process.execute(command_str) # wait to finish return self.process.output def main(): cli_session_0 = CliSession(0) cli_session_1 = CliSession(1) print(cli_session_0.run("export SOMETHING=10")) print(cli_session_1.run("echo $SOMETHING")) <- this should be nothing print(cli_session_0.run("echo $SOMETHING"))Điều này sẽ được sử dụng để thực hiện những việc như có nhiều phiên cho các máy khác nhau hoặc có các phiên trong đó nhiều lệnh cần được chạy trước một lệnh khác, nhưng các lệnh ban đầu không được biết đến sau này. Nếu bất cứ ai có thể chỉ cho tôi đúng hướng, hoặc nếu popen không thể làm điều này, hãy cho tôi biết!
Tôi đã đăng một câu hỏi về Overflow Stack, nhưng không ai trả lời, vì vậy nếu bạn muốn một số upvote Overflow, bạn có thể trả lời ở đó: //stackoverflow.com/questions/72007413/use-popen-to-have-sess -Rucky-Multiple-commands-at-a-prick-in-dom
Tệp này chứa văn bản unicode hai chiều có thể được giải thích hoặc biên dịch khác với những gì xuất hiện dưới đây. Để xem xét, hãy mở tệp trong một trình soạn thảo cho thấy các ký tự Unicode ẩn. Tìm hiểu thêm về các ký tự unicode hai chiều
#!/usr/bin/python | |
Nhập khẩu os | |
Nhập khẩu sys | |
Nhập khẩu select | |
Nhập khẩuParamiko paramiko | |
nhập khẩu time | |
ClassCommands: Commands: | |
def__init __ (self, retry_time = 0): __init__(self, retry_time=0): | |
self.retry_time=retry_time.retry_time = retry_time | |
đi qua | |
defrun_cmd (self, host_ip, cmd_list): run_cmd(self, host_ip, cmd_list): | |
i=0 = 0 | |
Whiletrue: True: | |
# in ("Cố gắng kết nối với %s ( %i/ %i)" %(self.host, i, self.retry_time))) | |
thử:: | |
ssh = paramiko.sshclient () = paramiko.SSHClient() | |
ssh.set_missing_host_key_policy (paramiko.autoaddpolicy ()).set_missing_host_key_policy(paramiko.AutoAddPolicy()) | |
ssh.connect (host_ip).connect(host_ip) | |
break | |
ngoại trừ paramiko.AuthenticationException: | |
in ("Xác thực thất bại khi kết nối với %s" %host_ip)("Authentication failed when connecting to %s" % host_ip) | |
sys.exit (1).exit(1) | |
ngoại trừ:: | |
in ("Không thể SSH đến %s, chờ nó bắt đầu" %host_ip)("Could not SSH to %s, waiting for it to start" % host_ip) | |
i+=1 += 1 | |
thời gian.s ngủ (2).sleep(2) | |
# Nếu chúng ta không thể kết nối trong giới hạn thời gian | |
ifi> = self.retry_time: i >= self.retry_time: | |
In ("Không thể kết nối với %s. Từ bỏ" %host_ip)("Could not connect to %s. Giving up" % host_ip) | |
sys.exit (1).exit(1) | |
ngoại trừ: | |
in ("Không thể SSH đến %s, chờ nó bắt đầu" %host_ip) | |
thời gian.s ngủ (2) command in cmd_list: | |
# Nếu chúng ta không thể kết nối trong giới hạn thời gian | |
ifi> = self.retry_time: "> " + command | |
In ("Không thể kết nối với %s. Từ bỏ" %host_ip) | |
# Sau khi kết nối thành công, stdout, stderr = ssh.exec_command(command) | |
# Gửi lệnh | |
forcommandincmd_list: | |
# lệnh in not stdout.channel.exit_status_ready(): | |
in ">"+lệnh | |
# thực thi các lệnh stdout.channel.recv_ready(): | |
stdin, stdout, stderr = ssh.exec_command (lệnh), wl, xl = select.select([ stdout.channel ], [ ], [ ], 0.0) | |
# Todo (): Nếu bị loại bỏ, hãy dừng lại len(rl) > 0: | |
# Chờ lệnh chấm dứt = stdout.channel.recv(1024) | |
whilenotstdout.channel.exit_status_ready (): = tmp.decode() | |
# Chỉ in dữ liệu nếu có dữ liệu để đọc trong kênh output | |
ifstdout.channel.recv_ready (): | |
rl, wl, xl = select.select ([stdout.channel], [], [], 0,0).close() | |
return | |
iflen (rl)> 0: main(argv=None): | |
tmp = stdout.channel.recv (1024) argv is None: | |
output = tmp.decode () "arguments expected" | |
PrintOutput: | |
# Đóng kết nối SSH | |
ssh.close () | |
DEFMAIN (argv = none): | |
ifargvisnone: | |
In "Đối số mong đợi" "This method is not meant to be used directly" | |
return | |
khác: __name__ == "__main__": | |
# argv = {'',}(sys.argv[ 1: ]) |