Tôi đang chỉnh sửa một tập lệnh init.d. Kịch bản init.d chạy một kịch bản tiện ích, sau đó chạy một tiến trình. Từ các tập lệnh bash, làm thế nào để tôi khởi chạy quy trình chính với tư cách là một người dùng và nhóm cụ thể?
Tôi đang chỉnh sửa một tập lệnh init.d. Kịch bản init.d chạy một kịch bản tiện ích, sau đó chạy một tiến trình. Từ các tập lệnh bash, làm thế nào để tôi khởi chạy quy trình chính với tư cách là một người dùng và nhóm cụ thể?
Câu trả lời:
Cách đơn giản nhất là sử dụng lệnh su (1), nó có một tùy chọn cho phép bạn chạy một lệnh thông qua trình bao của người dùng, ví dụ:
su foo -c ls
Điều này sẽ chuyển sang người dùng foo và chạy lệnh ls. Nếu người dùng bạn muốn sử dụng không có shell hợp lệ (nghĩa là nó không có trong / etc / shell, như / bin / false hoặc / sbin / nologin), bạn cũng sẽ phải chỉ định shell trên dòng lệnh. Ví dụ với đầu ra:
# su nobody -s /bin/bash -c id
uid=99(nobody) gid=99(nobody) groups=99(nobody) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
su www-data -c ${MONOSERVER} /applications=${WEBAPPS} /socket=unix:/path/monoserve.pid &nếu tôi su www-datađặt tất cả các vars và chạy ${MONOSERVER} /applications=${WEBAPPS} /socket=unix:/path/monoserve.pid &nó hoạt động tốt. Làm thế nào để tôi giải quyết điều này?
sucó một đối số duy nhất, đó là lệnh shell. Bạn cần ghi su www-data -c '$MONOSERVER "/application=$WEBAPPS" "/socket=unix:/path/monoserve.pid"', và chắc chắn rằng MONOSERVERvà WEBAPPSđược xuất khẩu bằng vỏ mẹ. (Lưu ý: không làm su … -c "$MONOSERVER …"như vậy sẽ thất bại nếu bất kỳ biến nào chứa các ký tự đặc biệt shell.) Và nếu bạn có một trình khởi chạy daemon chuyên dụng nhưstart-stop-daemon , hãy sử dụng nó.
Nếu start-stop-daemoncó sẵn trên hệ thống của bạn, có lẽ bạn nên sử dụng nó và xem xét các tùy chọn của nó (đặc biệt -uvà -gtrong trường hợp này).
(Nếu không, bạn có thể sử dụng kết hợp suvà sg.)
Cập nhật: Dưới đây là một ví dụ được lấy từ một số /etc/init.d/mpdtập lệnh (sử dụng start-stop-daemon):
Lệnh bắt đầu:
echo "Starting Music Player Daemon"
start-stop-daemon --start --quiet --background --exec /usr/bin/mpd \
--pidfile /var/run/mpd.pid --make-pidfile \
-- --no-daemon /etc/mpd.conf 2>/dev/null
Tất cả mọi thứ sau đây --là một đối số cho /usr/bin/mpdchính chương trình. (Quy trình trình nền được chăm sóc bởi tập lệnh start-stop-daemon nên mpdđược yêu cầu không quan tâm đến nó --nodaemon.)
Lệnh dừng:
echo "Stopping Music Player Daemon"
start-stop-daemon --stop --exec /usr/bin/mpd --pidfile /var/run/mpd.pid
Nếu mpdkhông được bỏ đặc quyền của riêng của mình, người ta sẽ cần thêm (ví dụ) -u mpd, -g mpdtùy chọn để các start-stop-daemonlệnh.
start-stop-daemon --start --quiet --background -u www-data -g www-data --exec ${MONOSERVER} --pidfile /path/monoserve.pid --make-pidfile -- /applications=${WEBAPPS} /socket=unix:/path/monoserve.pid
Usage: su [options] [LOGIN]vàsu: unrecognized option '--debug'