khởi động lại nhiều máy từ xa


11

Tôi cần phải khởi động lại một số máy từ xa. Thông thường tôi chỉ phát hành

for host in <hostlist>;do ssh ${host} 'sudo shutdown -r now';done

Nhưng tôi muốn cung cấp cho người dùng một thời gian trước khi khởi động lại. Tuy nhiên, phiên ssh họ sẽ không ngắt kết nối ngay cả khi tôi sử dụng:

ssh -f 'sudo shutdown -r +5 &;disown'

Tôi nhận được một thông báo lỗi:

bash: -c: dòng 0: lỗi cú pháp gần mã thông báo không mong muốn ;' bash: -c: line 0:sudo shutdown -r +5 &; disown '

Bất kỳ đề xuất?


1
Tôi nên thêm rằng tôi đang cố gắng gửi lệnh tắt máy đến nền với "&". Nếu hệ vỏ đang diễn giải "&" là một dấu tách lệnh thì tôi sẽ không biết làm thế nào để gửi nó đến nền để lệnh "disown" hoạt động.
Horace

Nhân &vật sẽ gửi lệnh ở phía bên tay trái trong nền. Đó là cách nó khác với ;.
kasperd

Câu trả lời:


31

Như đã thông báo bởi thông báo lỗi, bạn có lỗi cú pháp trong lệnh của mình. Đó là do một thực tế hơi ngạc nhiên &không phải là một phần của lệnh shell mà là một dấu phân cách giữa các lệnh (giống như ;). Mặc dù cả hai đều là dấu phân cách lệnh &có tác dụng bổ sung cho lệnh ở phía bên trái của nó. Điều này chắc chắn cũng làm tôi bối rối đôi khi, và tôi thường xuyên mắc lỗi tương tự. Một khi bạn biết nó, nó rất dễ sửa chữa.

Cách khắc phục là không viết &;mà chỉ viết một trong hai dấu phân cách tùy theo ý định của bạn. (Và trong hầu hết các trường hợp người ta đã viết &;ý định chỉ viết &).

Điều này sẽ làm việc:

ssh server 'sudo shutdown -r +5 & disown'

7
Bạn giành được giải thưởng ngày hôm nay vì đã dạy tôi điều gì đó mà tôi không biết sau 25 năm bash trên UNIX. Cũng +1!
MadHatter

Nếu anh ta định chạy sudo shutdown -r +5 &trên nền và sau đó chạy thì disownsao? Bash sẽ xử lý tình huống như thế nào? Tôi hy vọng đây sẽ là cú pháp hoàn hảo cho một lệnh, thậm chí là có &;. Nếu ;là một dấu tách lệnh, thì bạn có 2 lệnh trên tay. Đúng?
Ismael Miguel

1
@IsmaelMiguel Tôi không nhận được câu hỏi của bạn. Sử dụng &sẽ bắt đầu lệnh đầu tiên trong nền và một khi lệnh đầu tiên được bắt đầu, lệnh thứ hai sẽ được chạy ở nền trước.
kasperd

Tôi có nghĩa là sudo shutdown -r +5 &; disownkhông có vẻ như một cú pháp xấu. Ý tôi là, ý định của tôi có thể là chạy phần đầu tiên trong nền và sau đó là phần thứ hai.
Ismael Miguel

@IsmaelMiguel Trình phân tích cú pháp lệnh có thể được mở rộng để coi chuỗi rỗng là một lệnh hợp lệ luôn thành công. Trong trường hợp sudo shutdown -r +5 &; disownđó sẽ được coi là ba lệnh hợp lệ được phân tách bằng &;. Tuy nhiên, điều đó có nghĩa là người ta phải cẩn thận không sử dụng dấu phân cách bổ sung nếu trạng thái tồn tại của lệnh trước đó được sử dụng. Điều đó không có nghĩa là người ta phải chú ý đến việc token hóa vì ví dụ &&& &được token hóa khác nhau.
kasperd
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.