systemctl cho phép khác với khởi động systemctl, làm thế nào?


16

Tôi đang chạy một hộp Arch Linux (mới nhất, cập nhật) và cố gắng để MySQL khởi động khi khởi động. Với gói systemd được cài đặt, tôi có sẵn systemctl và như vậy tôi có thể làm những việc như thế này:

systemctl start mysqld.service
systemctl [stop|status|restart] mysqld.service

Điều đó hoàn toàn tốt, và hoạt động rất tốt khi tôi muốn bắt đầu / dừng thủ công, tuy nhiên, khi bắt đầu khởi động (bằng cách sử dụng 'enable' trên systemctl, tôi nhận được một số đầu ra khó chịu):

[root@rudivarch ~]# systemctl enable mysqld.service
Failed to issue method call: No such file or directory

Rõ ràng, vì các lệnh khác hoạt động tốt, tôi thực sự bối rối vì điều này và đã sử dụng tốt trong khi cố gắng tìm ra ... trạng thái systemctl xuất ra điều này:

[root@rudivarch ~]# systemctl status mysqld.service
mysqld.service
     Loaded: loaded (/etc/rc.d/mysqld)
     Active: inactive (dead) since Tue, 31 Jan 2012 15:32:28 +0000; 1min 25s ago
    Process: 589 ExecStop=/etc/rc.d/mysqld stop (code=exited, status=0/SUCCESS)
    Process: 257 ExecStart=/etc/rc.d/mysqld start (code=exited, status=0/SUCCESS)
    CGroup: name=systemd:/system/mysqld.service

Bất cứ ai cũng có bất kỳ ý tưởng nào về lý do tại sao 'kích hoạt' không hoạt động?

Câu trả lời:


19

mysqld.servicelà một đơn vị "ảo" - nó không tồn tại trên hệ thống tập tin, nó chỉ là một phần của lớp tương thích của systemd. Bạn có thể khởi động nó và systemd sẽ chạy bản in di sản /etc/rc.d/mysqld, nhưng bạn không thể systemctl enablevì bạn cần một .servicetệp thực sự có thể được liên kết vào vị trí thích hợp.

Bạn có thể tự viết một đơn vị như vậy và đặt nó vào /etc/systemd/system/mysqld.service:

[Đơn vị]
Mô tả = Máy chủ MySQL
Sau = mạng.target

[Dịch vụ]
ExecStart = / usr / bin / mysqld --defaults-file = / etc / mysql / my.cnf --datadir = / var / lib / mysql --socket = / var / run / mysqld / mysqld.sock
Người dùng = mysql
Nhóm = mysql
WorkDirectory = / usr

[Tải về]
WantedBy = multi-user.target

Chạy systemctl daemon-reloadsau khi tạo / sửa đổi.


Ngoài ra, bạn có thể cài đặt initscripts-systemdgói, bao gồm arch-daemons.targettự động bắt đầu các dịch vụ được xác định trong rc.conf. Tuy nhiên, gói này có thể sẽ biến mất sớm và tốt hơn là luôn có các tệp cấu hình gốc cho hệ thống init đang sử dụng.


Cảm ơn! Tôi thực sự đã viết mysqld.service của riêng tôi rất giống với dịch vụ này ngày hôm qua, nhưng chuyển qua /etc/rc.d/mysqld start / stop cho ExecStart / ExecStop. Được chấp nhận, sẽ đăng phiên bản của tôi lên trong trường hợp người khác tìm thấy nó! Cảm ơn
Rudi Visser

3

Câu trả lời của @ Grawity là chính xác và có lẽ tốt hơn thế này, nhưng về cơ bản tôi đã giải quyết nó bằng cách chuyển qua tập lệnh RC.d ...

/lib/systemd/system/mysqld.service

[Unit]
Description=MySQL Server
After=network.target

[Service]
Type=forking
ExecStart=/etc/rc.d/mysqld start
ExecStop=/etc/rc.d/mysqld stop

[Install]
WantedBy=multi-user.target

2

Ghi chú: Hãy nhớ đặt các tệp đơn vị cụ thể của máy chủ /etc/systemd/system/và KHÔNG /lib/systemd/system/.

Thứ hai là cho các công cụ cụ thể distro; trước đây là cho các công cụ cụ thể máy chủ lưu trữ mà bạn tự cấu hình. Nó giống như /usr/bin/so với /usr/local/bin/, tương ứng.

Vì vậy, trừ khi một gói tự cài đặt các tệp đơn vị (bên dưới /lib/systemd/system/), hãy đặt công cụ "tùy chỉnh" của riêng bạn vào bên dưới /etc/systemd/system/.


1
Điều này không thực sự trả lời câu hỏi của anh ấy. Điều này trông giống như một bình luận cho câu trả lời của @ Rudi.
PhilT

0

Cho phép là để kích hoạt "đơn vị" aka daemon aka dịch vụ khi khởi động systemd.

OpenSUSE:

# systemctl list-units --all | grep sql
mysql.service             loaded inactive dead          LSB: Start the MySQL database 
(good)

# systemctl enable mysql.service
mysql.service is not a native service, redirecting to /sbin/chkconfig.
Executing /sbin/chkconfig mysql on
insserv: Service localfs has to exists for service vmware-USBArbitrator
insserv: Service network is missed in the runlevels 2 to use service vmware
Warning: unit files do not carry install information. No operation executed.

(it actually redirects to old chkconfig/sysvinit and that corrects init databases)

# systemctl start mysql.service

(no output)

# systemctl status mysql.service
mysql.service - LSB: Start the MySQL database server
          Loaded: loaded (/etc/init.d/mysql)
          Active: active (running) since Tue, 31 Jan 2012 20:07:52 +0100; 5s ago
         Process: 999999 ExecStart=/etc/init.d/mysql start (code=exited, status=0/SUCCESS)
          CGroup: name=systemd:/system/mysql.service
                  ├ 999999 /bin/sh /usr/bin/mysqld_safe --mysqld=mysqld --user=mysql...
                  └ 999999 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql...

(sort of runs)

Có, tôi hiểu điều này và mysqld là một daemon / dịch vụ mà tôi muốn chạy khi khởi động. Đây là quan điểm của tôi, nó bắt đầu / dừng, nhưng sẽ không "bật".
Rudi Visser

0

Trên hệ thống FC15 của tôi, khi tôi chạy 'systemctl kích hoạt mysqld.service', nó tự động quay lại với:

mysqld.service không phải là dịch vụ gốc, chuyển hướng đến / sbin / chkconfig. Đang thực hiện / sbin / chkconfig mysqld trên

Vì vậy, hãy thử chạy: /sbin/chkconfig mysqld on


0

Nếu bạn có ... khi bật đơn vị dịch vụ của mình, hãy sao chép nó vào / etc / systemd / system

Failed to issue method call: No such file or directory

Để bật đơn vị dịch vụ của bạn, hãy thêm bên dưới ... để bạn có thể kích hoạt hệ thống mysqld.service (tính năng này trong mọi không gian tên của người dùng)

[Install]
WantedBy=multi-user.target

Chúc mừng, sugatang itlog

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.