2013-10-11 44 views
6

Tôi đang cố gắng nói với Bash, đợi cho quá trình Bắt đầu/Bắt đầu. Tôi đang cố gắng bằng cách này ví dụ:Bash chờ quá trình bắt đầu

notepad=`pidof notepad.exe` 
    until [ $notepad > 0 ] 
     do 
      taskset -p 03 $notepad 
      renice -n 5 -p $notepad 
      sleep 5 
      renice -n 0 -p $notepad 
     done 

tôi cũng có những câu hỏi sau:

  1. tại sao điều này tạo ra một tập tin gọi là “0" (tập tin đang trống) tôi không muốn tạo một tệp mới, chỉ cần đợi cho PID kiểm tra thực hiện.

  2. Đây là vòng lặp, nhưng nếu 2 lệnh thực thi correclty, 1 lần cách tôi có thể tiếp tục thực hiện ???

  3. Để sử dụng tốt hơn "cho đến khi nào" ???

  4. Một ý tưởng khác để chờ quá trình Bắt đầu hoặc Bắt đầu ???

Trả lời

2

Để trả lời câu hỏi đầu tiên của bạn: '>' không phải là toán tử toán học/so sánh 'lớn hơn'; Đó là cách bash cho phép bạn đầu ra đường ống vào một tập tin (xử lý).

echo "some text" > myfile.txt 

sẽ tạo tệp có tên myfile.txt và '>' gửi đầu ra của lệnh vào tệp đó. Tôi sẽ tưởng tượng rằng tập tin của bạn '0' có pid trong nó, và không có gì khác.

Thay vào đó, hãy thử -gt (hoặc liên quan đến các biến thể: -ge, -lt, -le, -eg, -ne) để kiểm tra xem một giá trị lớn hơn (hoặc: lớn hơn hoặc bằng, ít hơn, nhỏ hơn hoặc bằng, bình đẳng, không bằng nhau, tương ứng) để xem điều đó có giúp ích gì không. Đó là,

until [ $notepad -gt 0 ] 
+0

Cảm ơn bạn, nhưng tôi quên điều đó và ">>" là dành cho ??? – inukaze

+1

'>' ghi vào một tệp.Nếu tệp tồn tại, nó sẽ bị ghi đè. '>>' nối thêm vào cuối tập tin; nếu tập tin chưa tồn tại, nó sẽ được tạo. '>' có thể xóa dữ liệu, '>>' thì không. – dangenet

14

Có nhiều vấn đề với mã của bạn:

  1. pidof không in 0 hoặc -1 nếu không có quá trình, vì vậy logic của bạn là sai
  2. pidof có thể trả về nhiều pids nếu có nhiều quy trình, điều này sẽ làm hỏng việc so sánh của bạn
  3. > phải được thoát trong [ ] nếu không mã của bạn tương đương với [ $notepad ] > 0, hướng đến tệp.
  4. > thậm chí không phải là toán tử phù hợp. Bạn muốn -gt, nhưng như đã đề cập ở điểm # 1 và # 2, bạn không nên so sánh các số.
  5. until chạy vòng lặp cho đến khi điều kiện là đúng. nó không chờ điều kiện trở thành sự thật, và sau đó chạy vòng lặp.

Đây là cách bạn nên làm điều đó:

# Wait for notepad to start 
until pids=$(pidof notepad) 
do 
    sleep 1 
done 

# Notepad has now started. 

# There could be multiple notepad processes, so loop over the pids 
for pid in $pids 
do   
    taskset -p 03 $pid 
    renice -n 5 -p $pid 
    sleep 5 
    renice -n 0 -p $pid 
done 

# The notepad process(es) have now been handled 
+0

bạn có thể giải thích cho tôi hoặc cung cấp cho một liên kết với giải thích cách làm thế nào thats dòng 1 - PID = (pidof notepads) ok các PID biến = Một số Entire Số 2 - cho pid trong $ PID tại sao pid? trong $ pids là biến, nhưng tôi không cam kết "pid" này là làm cho một biến thể mới ??? – inukaze

+0

'pids = $ (pidof notepad)' trở thành 'pids =" 14436 16690 19023 "' (hoặc có thể chỉ là "pids =" 14436 "' nếu chỉ có một notepad đang chạy). Với vòng lặp for, bạn lặp qua từng số này trong '$ pids'. Mỗi lần vòng lặp chạy, '$ pid' sẽ là một giá trị khác với danh sách trong' $ pids', vì vậy lần đầu tiên nó sẽ là 14436, lần sau là 16690, v.v. –

1

Nếu tôi hiểu đúng, bạn muốn đợi cho đến khi notepad được khởi chạy. Sau đó, pidof phải nằm trong vòng lặp của bạn.

while ! pidof notepad.exe >> /dev/null ; 
do 
sleep 1 
done 
notepad=$(pidof notepad.exe) 
taskset -p 03 $notepad 
renice -n 5 -p $notepad 
sleep 5 
renice -n 0 -p $notepad 
+0

Ý tưởng thực sự của nó, khi bộ công việc & renice, được áp dụng, thoát khỏi vòng lặp để tiếp tục với tập lệnh. Tôi không biết liệu ý tưởng hay có được sử dụng hay không. – inukaze

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