2009-06-25 22 views
5

Tôi đang cố gắng khởi chạy ở chế độ nền công việc trên máy từ xa và lấy PID của nó để tôi có thể xóa nó sau này. Những gì tôi đã đưa ra cho đến nay là như sau:Bắt pid của một công việc được khởi chạy ở chế độ nền từ xa

#!/bin/bash 

IP=xxx.xxx.xxx.xx 
REMOTE_EXEC="ssh $IP -l root" 

# The following does NOT work, I am trying to get the PID of the remote job 
PID=`$REMOTE_EXEC 'vmstat 1 1000 > vmstat.log & ; echo $!'` 

# Launch apache benchmark 
ab -n 10 http://$IP/ 

$REMOTE_EXEC "kill $PID" 

Thật không may nó không hoạt động. Tôi đang nhận được một số

bash: syntax error near unexpected token `;' 

nhưng tôi không biết cú pháp đúng là gì.

+0

Đơn giản chỉ cần: 'vmstat 1 1000> vmstat.log &; echo $! ' thậm chí không cục bộ. Hãy nhìn vào nó. –

+0

Vâng tôi biết. Vì vậy, tôi cần sửa chữa cho 'vmstat 1 1000> vmstat.log &; echo $! ' hoặc tôi cần lấy PID của công việc từ xa thông qua một số cơ chế khác. – davitenio

+0

@davitenio Không PID kết thúc dưới dạng PID của lệnh ssh cục bộ, không phải lệnh vmstat từ xa? –

Trả lời

3

Bạn gặp lỗi, vì bạn ';' là dư thừa, hãy thử 'vmstat 1 1000> vmstat.log & echo $!'

Nhưng tôi không chắc chắn nó sẽ hoạt động, bởi vì sau khi bạn đăng xuất, quá trình sẽ nhận được SIGHUP. Nhìn vào nohup (1).

+0

Nó hoạt động, ngay cả khi không sử dụng nohup. Cảm ơn! – davitenio

+0

Vâng, bạn có quyền ... Có thể, điều đó xảy ra, bởi vì trong trường hợp này ssh không "đăng nhập" bạn (từ ssh (1): "Nếu lệnh được chỉ định, nó được thực thi trên máy chủ từ xa thay vì shell đăng nhập. "). – dmitri

2

Hãy thử xung quanh lệnh backgrounded trong dấu ngoặc nhọn:

PID=`$REMOTE_EXEC '{ vmstat 1 1000 > vmstat.log & }; echo $!'` 
0

Trong trường hợp bạn sử dụng yếu trích dẫn, bạn cần phải thoát khỏi $! như sau:

$REMOTE_EXEC "{ vmstat 1 1000 > vmstat.log & }; echo \$!" 

hoặc

P=`$REMOTE_EXEC "{ vmstat 1 1000 > vmstat.log & }; echo \\\$!"` 
+0

Tôi nhận được -bash:! ": Không tìm thấy sự kiện với máy chủ ssh" {executable & }; echo \ $! " –

+0

Nó có thể phụ thuộc vào HĐH của bạn. Nó hoạt động hoàn hảo trên Ubuntu 12 trở lên. báo giá yếu, cố gắng thoát ra! biểu tượng quá như được mô tả ở đây http://serverfault.com/questions/208265/what-is-bash-event-not-found hoặc không sử dụng trích dẫn yếu. – Rom098

+0

Tôi đã tìm thấy sự cố - nó Nếu tôi sử dụng dòng bên trong của một kịch bản, nó hoạt động chính xác, nhưng nếu tôi chạy nó trực tiếp từ một thiết bị đầu cuối, nó đã thất bại. Nếu tôi tắt mở rộng lịch sử với 'set + H', thì nó hoạt động tốt từ thiết bị đầu cuối. –

Các vấn đề liên quan