Crontab s ed o príkazy na stream, výsledky v "č o vykonanej zmene"

0

Otázka

Snažím sa pridávať linky na moje súbor crontab. Viem, že existujú aj iné spôsoby, ako obísť tento problém, ale stále chcete vedieť, čo spôsobilo, že. Príkaz spustiť na raspberry pi 3 B+, raspbian lite je nainštalovaný, s GNU ed 1.15, cron 3.0pl1-134+deb10u1.

Príkaz, že som uviazol na to je tento:

$ echo -e 'a\n#asdf\n.\nwQ' | EDITOR=ed crontab -e
902
909
No modification made

Ja som očakával, že ak chcete pridať riadok #asdf na konci môjho crontab súbor, ale nie je to tak.

Nastavenie EDITOR='tee -a' ako navrhol na https://stackoverflow.com/a/30123606/8842387 nerieši problém. Takže si myslím, že to je problém s cron.

Napodiv, keď som dať ed príkazy priamo z klávesnice, skôr ako streaming, to jednoducho funguje. Možno subshell tvorba spôsobil problém?

Tu som nasadenie niekoľkých posledných riadkov z strace výsledok.

$ echo -e 'a\n#asdf\n.\nwQ' | EDITOR=ed strace crontab -e
execve("/usr/bin/crontab", ["crontab", "-e"], 0x7ee54c14 /* 29 vars */) = 0
access("/etc/suid-debug", F_OK)         = -1 ENOENT (No such file or directory)
...
read(3, "TZif2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\0\0\0\7\0\0\0\0"..., 4096) = 659
_llseek(3, -393, [266], SEEK_CUR)       = 0
read(3, "TZif2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\0\0\0\7\0\0\0\0"..., 4096) = 393
close(3)                                = 0
getpid()                                = 18579
socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC, 0) = 3
connect(3, {sa_family=AF_UNIX, sun_path="/dev/log"}, 110) = 0
send(3, "<78>Nov 20 15:31:25 crontab[1857"..., 56, MSG_NOSIGNAL) = 56
openat(AT_FDCWD, "crontabs/pi", O_RDONLY) = -1 EACCES (Permission denied)
openat(AT_FDCWD, "/usr/share/locale/locale.alias", O_RDONLY|O_CLOEXEC) = 4
fstat64(4, {st_mode=S_IFREG|0644, st_size=2995, ...}) = 0
read(4, "# Locale name alias data base.\n#"..., 4096) = 2995
read(4, "", 4096)                       = 0
close(4)                                = 0
openat(AT_FDCWD, "/usr/share/locale/en_GB.UTF-8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/share/locale/en_GB.utf8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/share/locale/en_GB/LC_MESSAGES/libc.mo", O_RDONLY) = 4
fstat64(4, {st_mode=S_IFREG|0644, st_size=1433, ...}) = 0
mmap2(NULL, 1433, PROT_READ, MAP_PRIVATE, 4, 0) = 0x76f50000
close(4)                                = 0
openat(AT_FDCWD, "/usr/share/locale/en.UTF-8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/share/locale/en.utf8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/share/locale/en/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
write(2, "crontabs/pi/: fdopen: Permission"..., 39crontabs/pi/: fdopen: Permission denied) = 39
exit_group(1)                           = ?
+++ exited with 1 +++

openat(AT_FDCWD, "crontabs/pi", O_RDONLY) = -1 EACCES (Permission denied) vyzerá trochu podozrivé, ale nie sú istí, prečo to otvorí súbor iba na čítanie.

ÚPRAVA: Ako napovedá @tink, bežal som EDITOR=ed strace crontab -e ak chcete vidieť, aké strace dáva na interaktívnu reláciu. Výsledkom bol takmer rovnaký (iba rôznej na pid a fd čísla).

Všimol som si, že beží echo "..." | EDITOR=ed crontab -e vystúpil so správou No modification made ale s strace proces sa zastaví bez akejkoľvek správy. (EDITOR=ed strace crontab -e 2>&1 | grep "No mod" vytlačí nič). Myslím, strace spúšťa rôzne chyby.

bash cron ed linux
2021-11-20 06:41:51
1

Najlepšiu odpoveď

0

V nadväznosti na mojom VISUAL komentár, tieto pracoval pre mňa:

( unset VISUAL; printf '%s\n' a '#abcd' . wq | EDITOR=ed crontab -e )
printf '%s\n' a '#abcd' . wq | VISUAL=ed crontab -e

V mojom prostredí, zrakovú a EDITOR sú nastavené na "vim"

Alebo, viac kruhový objazd, ale nemusíte opice s env vars. Tento jeden tiež umožňuje, aby si to ticho:

crontab <(printf '%s\n' a '#asdf' . '%p' | ed -s <(crontab -l))

Robil som vyššie na počítači Mac. Na Linux, môžem reprodukovať svoje pozorovania, ale nedá vysvetliť ich.

Malý trik, aby posledný príkaz funguje:

printf '%s\n' a '#asdf' . '%p' Q | ed -s <(crontab -l) | crontab -
2021-11-21 20:34:51

Vďaka za odpoveď! Mám strach povedať, že ani jeden z vyššie uvedených dva riadky pracoval pre mňa, a posledný, ktorý dáva /dev/fd/63: Not a regular file. Možno, že niektoré konfigurácie systému byť iný?
bivoje

V iných jazykoch

Táto stránka je v iných jazykoch

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................