Đưa id tiến trình ra khỏi lệnh được khởi chạy cùng với su su -c '


9

Tôi đang chạy một chương trình java bên trong trình bao và viết id tiến trình vào tệp văn bản. Vì vậy, khi tôi làm điều này:

nohup java app.Main > /dev/null 2>&1 &
echo $! > /var/run/app.pid

Nó hoạt động. Nhưng tôi thực sự muốn chạy nó như một người dùng khác

su - appuser -c "nohup java app.Main > /dev/null 2>&1 &"
echo $! > /var/run/app.pid

Điều này không hoạt động. Có cách nào để có được id tiến trình của lệnh được khởi chạy với tùy chọn -c không?

Câu trả lời:


8

Bạn có thể làm:

su - appuser -c 'nohup java app.Main > /dev/null 2>&1 &
                 echo "$!"' > /var/run/app.pid

(giả sử vỏ đăng nhập của appusergiống như Bourne).

su -Đặt lại môi trường, vì vậy nếu bạn muốn mở rộng các biến trong dòng lệnh, thì nó phải được thực hiện bởi shell của bạn (không phải shell đăng nhập của người dùng từ xa) như:

su - appuser -c "nohup '$JAVA_BIN' '$JAVA_CLASS' > /dev/null 2>&1 &"'
                 echo "$!"' > /var/run/app.pid

(giả sử các biến đó không chứa các ký tự trích dẫn đơn).

Bạn muốn chuyển hướng được thực hiện bởi trình bao của bạn (chạy dưới dạng root), chứ không phải trình appuserbao (có lẽ không có quyền ghi /var/run).


2
Cảm ơn bạn. Điều đó đã làm việc, nhưng tôi phải điều chỉnh nó một chút cho trường hợp của tôi. Vì một số lý do, tôi đã phải thêm dấu gạch chéo ngược trước $! và sau đó tôi đã phải chuyển nó sang tệp tmp vì vấn đề cấp phép. Dòng tiếp theo sẽ đọc nó từ tệp tmp và đặt nó vào vị trí thích hợp. su - appuser -c "nohup $JAVA_BIN $JAVA_CLASS > /dev/null 2>&1 & echo \$! > /tmp/appid.tmp"
Prasanth

@Prasanth, xem chỉnh sửa của tôi.
Stéphane Chazelas
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.