Я хочу позволить sslocal управлять автоматическим запуском, таким образом, я пишу в/etc/rc.local
sudo sslocal -c /etc/ss.json -d start
plank
exit 0
но после того, как я перезапускаю, sudo systemctl status rc-local
это показывает это
rc-local.service - /etc/rc.local Compatibility
Loaded: loaded (/lib/systemd/system/rc-local.service; static; vendor preset: enabled)
Drop-In: /lib/systemd/system/rc-local.service.d
└─debian.conf
Active: failed (Result: exit-code) since 2017-12-07 16:05:51 +08; 6min ago
Process: 1155 ExecStart=/etc/rc.local start (code=exited, status=1/FAILURE)
December 07 16:05:46 lucas-CW65S rc.local[1155]: INFO: loading config from /etc/ss.json
December 07 16:05:50 lucas-CW65S rc.local[1155]: 2017-12-07 16:05:50 INFO loading libcrypto from libcrypto.so.1.0.0
December 07 16:05:50 lucas-CW65S sudo[1158]: pam_unix(sudo:session): session closed for user root
December 07 16:05:51 lucas-CW65S rc.local[1155]: Failed to connect to Mir: Failed to connect to server socket: no file and directory
December 07 16:05:51 lucas-CW65S rc.local[1155]: Unable to init server: cannot connect : deny connect
December 07 16:05:51 lucas-CW65S rc.local[1155]: [WARN 16:05:51.155503] [Gtk] cannot open display:
December 07 16:05:51 lucas-CW65S systemd[1]: rc-local.service: Control process exited, code=exited status=1
December 07 16:05:51 lucas-CW65S systemd[1]: Failed to start /etc/rc.local Compatibility.
December 07 16:05:51 lucas-CW65S systemd[1]: rc-local.service: Unit entered failed state.
December 07 16:05:51 lucas-CW65S systemd[1]: rc-local.service: Failed with result 'exit-code'
ключевой пункт может быть sudo[1158]: pam_unix(sudo:session): session closed for user root
и кажется, что этому нужен sudo пароль, когда переключатель к sudo состоянию, но как я могу ввести его в rc.local файле?..
У вас там две проблемы.
/etc/rc.local
запускается от имени пользователя root, поэтому вам не нужно sudo
rc.local
- это скрипт, он последовательный, и каждая команда блокирует выполнение. Запустите ваши команды в фоновом режиме, добавив &
в конце. Также обратите внимание, что rc.local
использует #!/bin/sh -e
, что означает, что он выйдет при любой ошибке. Если вы хотите, чтобы сценарий продолжал выполнение, даже если одна из команд не выполнена, используйте подход command arg1 arg2 || true
.
Простое исправление : уберите слово «sudo» из вашего скрипта.
Причина : /etc/rc.local
уже работает от имени пользователя root, поэтому вам не нужен sudo
там.
PS: Вы не должны вызывать sudo
из сценария оболочки по любой причине.