Thực hiện chdir trước khi bắt đầu dịch vụ systemd


148

Câu hỏi: Tôi có thể khởi động một tiến trình với systemd và gán tiến trình đó cho một thư mục làm việc mà tôi chọn không?

Tôi có một dịch vụ mà tôi muốn bắt đầu systemd. Khi dịch vụ đó đang được bắt đầu, tôi muốn có thể gán cho nó một thư mục làm việc hiện tại. Tôi biết làm thế nào để làm điều này nếu tôi đang sử dụng init, nhưng tôi gặp rắc rối với systemd.

Đây là những gì tôi đã cố gắng để làm việc.

Dịch vụ của tôi

Tôi đã tạo một tiện ích đơn giản ("listdir"), được viết bằng Python và được đặt trong /opt/bin/listdir:

#! /usr/bin/python

import os

print 'Current working directory: %s' % (os.getcwd())

Tập tin cấu hình của tôi

Sau đó tôi đã tạo một listdir.servicetệp cho systemdvà đặt nó ở đây /lib/systemd/system/listdir.service::

[Unit]
Description=Test of listing CWD.

[Service]
ExecStartPre=chdir /usr/local
ExecStart=/opt/bin/listdir
StandardOutput=syslog
StandardError=syslog

[Install]
WantedBy=multi-user.target

Vấn đề

Khi tôi chạy systemctl start listdirnhật ký hệ thống của tôi ghi lại thư mục gốc ("/") là thư mục làm việc hiện tại. Tất nhiên, tôi mong đợi /usr/locallà thư mục hiện tại, vì tôi nghĩ ExecStartPresẽ thay đổi thư mục trước khi bắt đầu quá trình.

Rõ ràng, tôi đang tưởng tượng rằng nó systemdsẽ hoạt động giống như một kịch bản shell (mặc dù tôi biết đó không phải là một kịch bản shell). Ai đó có thể cho tôi một ý tưởng về những gì tôi nên làm? Thậm chí có thể thiết lập một thư mục làm việc bằng cách sử dụng systemd? Cảm ơn!


Chỉnh sửa: Nhật ký hệ thống của tôi đang báo lỗi. (Tôi chỉ nhận thấy.)

Executable path is not absolute, ignoring: chdir /usr/local 

Vì vậy, chdirlà một lệnh shell, và bản thân nó không phải là một lệnh thực thi. Được chứ. Nhưng vẫn còn một số cách để tôi thay đổi thư mục bằng cách sử dụng systemd?

Câu trả lời:


270

Trên systemd> = 227 bạn sẽ có thể sử dụng:

[Service]
WorkingDirectory=/usr/local

để có được kịch bản của bạn để thực hiện ở đó.

( DOCS )


4
Làm thế nào bạn tìm thấy điều này? Nó không được đề cập ở bất cứ đâu trong tài liệu !
jameshfisher

2
@jameshfisher nằm trong phần này của tài liệu
Eric Renouf

3
@EricRenouf aha, họ chỉ nên sao chép các tùy chọn được chia sẻ đó trong tài liệu dịch vụ
jameshfisher

3
Vì vậy, chỉ cho rõ ràng, điều này sẽ đi trong [Service]phần?
dthor

4
Trả lời bản thân, nó hoạt động trên CentOS 7 mới nhất, mặc dù là phiên bản.
BrunoJCM
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.